mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-01 09:24:10 +01:00
OP-1557 Update Qwt: Updated to 6.1.2
This commit is contained in:
parent
4f7fc1bac7
commit
cc5786c989
@ -15,30 +15,30 @@
|
|||||||
include( qwtconfig.pri )
|
include( qwtconfig.pri )
|
||||||
|
|
||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
CONFIG += ordered
|
||||||
|
|
||||||
# disable all warnings (no need for warnings as qwt sources are imported)
|
# disable all warnings (no need for warnings as qwt sources are imported)
|
||||||
CONFIG += warn_off
|
CONFIG += warn_off
|
||||||
CONFIG += ordered
|
|
||||||
SUBDIRS = src
|
|
||||||
|
|
||||||
# SUBDIRS = \
|
SUBDIRS = \
|
||||||
# src \
|
src \
|
||||||
# textengines \
|
# textengines \
|
||||||
# doc
|
# doc
|
||||||
|
|
||||||
#contains(QWT_CONFIG, QwtDesigner ) {
|
contains(QWT_CONFIG, QwtDesigner ) {
|
||||||
# SUBDIRS += designer
|
SUBDIRS += designer
|
||||||
#}
|
}
|
||||||
|
|
||||||
#contains(QWT_CONFIG, QwtExamples ) {
|
contains(QWT_CONFIG, QwtExamples ) {
|
||||||
# SUBDIRS += examples
|
SUBDIRS += examples
|
||||||
#}
|
}
|
||||||
|
|
||||||
#contains(QWT_CONFIG, QwtPlayground ) {
|
contains(QWT_CONFIG, QwtPlayground ) {
|
||||||
# SUBDIRS += playground
|
SUBDIRS += playground
|
||||||
#}
|
}
|
||||||
|
|
||||||
|
# qwtspec.files = qwtconfig.pri qwtfunctions.pri qwt.prf
|
||||||
|
# qwtspec.path = $${QWT_INSTALL_FEATURES}
|
||||||
|
|
||||||
#qwtspec.files = qwtconfig.pri qwtfunctions.pri qwt.prf
|
# INSTALLS += qwtspec
|
||||||
#qwtspec.path = $${QWT_INSTALL_FEATURES}
|
|
||||||
|
|
||||||
#INSTALLS += qwtspec
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#################################################################
|
################################################################
|
||||||
# Qwt Widget Library
|
# Qwt Widget Library
|
||||||
# Copyright (C) 1997 Josef Wilgen
|
# Copyright (C) 1997 Josef Wilgen
|
||||||
# Copyright (C) 2002 Uwe Rathmann
|
# Copyright (C) 2002 Uwe Rathmann
|
||||||
@ -12,10 +12,10 @@
|
|||||||
#
|
#
|
||||||
#################################################################
|
#################################################################
|
||||||
|
|
||||||
# QWT_VER_MAJ = 6
|
QWT_VER_MAJ = 6
|
||||||
# QWT_VER_MIN = 1
|
QWT_VER_MIN = 1
|
||||||
# QWT_VER_PAT = 1
|
QWT_VER_PAT = 2
|
||||||
# QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT}
|
QWT_VERSION = $${QWT_VER_MAJ}.$${QWT_VER_MIN}.$${QWT_VER_PAT}
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# Install paths
|
# Install paths
|
||||||
@ -25,10 +25,12 @@
|
|||||||
|
|
||||||
unix {
|
unix {
|
||||||
# QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION
|
# QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION
|
||||||
|
# QWT_INSTALL_PREFIX = /usr/local/qwt-$$QWT_VERSION-qt-$$QT_VERSION
|
||||||
}
|
}
|
||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
# QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION
|
# QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION
|
||||||
|
# QWT_INSTALL_PREFIX = C:/Qwt-$$QWT_VERSION-qt-$$QT_VERSION
|
||||||
}
|
}
|
||||||
|
|
||||||
# QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc
|
# QWT_INSTALL_DOCS = $${QWT_INSTALL_PREFIX}/doc
|
||||||
@ -113,7 +115,7 @@ QWT_CONFIG += QwtSvg
|
|||||||
# to your qmake project file.
|
# to your qmake project file.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
# QWT_CONFIG += QwtMathML
|
#QWT_CONFIG += QwtMathML
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# If you want to build the Qwt designer plugin,
|
# If you want to build the Qwt designer plugin,
|
||||||
@ -144,7 +146,7 @@ win32 {
|
|||||||
# Otherwise you have to build them from the examples directory.
|
# Otherwise you have to build them from the examples directory.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
# QWT_CONFIG += QwtExamples
|
#QWT_CONFIG += QwtExamples
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# The playground is primarily intended for the Qwt development
|
# The playground is primarily intended for the Qwt development
|
||||||
@ -155,7 +157,7 @@ win32 {
|
|||||||
# Otherwise you have to build them from the playground directory.
|
# Otherwise you have to build them from the playground directory.
|
||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
# QWT_CONFIG += QwtPlayground
|
#QWT_CONFIG += QwtPlayground
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
# When Qt has been built as framework qmake wants
|
# When Qt has been built as framework qmake wants
|
||||||
@ -163,6 +165,7 @@ win32 {
|
|||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
macx:!static:CONFIG(qt_framework, qt_framework|qt_no_framework) {
|
macx:!static:CONFIG(qt_framework, qt_framework|qt_no_framework) {
|
||||||
|
|
||||||
# QWT_CONFIG += QwtFramework
|
# QWT_CONFIG += QwtFramework
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,5 +175,6 @@ macx:!static:CONFIG(qt_framework, qt_framework|qt_no_framework) {
|
|||||||
######################################################################
|
######################################################################
|
||||||
|
|
||||||
unix {
|
unix {
|
||||||
# QWT_CONFIG += QwtPkgConfig
|
|
||||||
|
#QWT_CONFIG += QwtPkgConfig
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,10 @@
|
|||||||
class QwtLinearColorMap::ColorStops
|
class QwtLinearColorMap::ColorStops
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ColorStops()
|
ColorStops():
|
||||||
|
d_doAlpha( false )
|
||||||
{
|
{
|
||||||
_stops.reserve( 256 );
|
d_stops.reserve( 256 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void insert( double pos, const QColor &color );
|
void insert( double pos, const QColor &color );
|
||||||
@ -38,20 +39,50 @@ private:
|
|||||||
|
|
||||||
ColorStop( double p, const QColor &c ):
|
ColorStop( double p, const QColor &c ):
|
||||||
pos( p ),
|
pos( p ),
|
||||||
rgb( c.rgb() )
|
rgb( c.rgba() )
|
||||||
{
|
{
|
||||||
r = qRed( rgb );
|
r = qRed( rgb );
|
||||||
g = qGreen( rgb );
|
g = qGreen( rgb );
|
||||||
b = qBlue( rgb );
|
b = qBlue( rgb );
|
||||||
|
a = qAlpha( rgb );
|
||||||
|
|
||||||
|
/*
|
||||||
|
when mapping a value to rgb we will have to calcualate:
|
||||||
|
- const int v = int( ( s1.v0 + ratio * s1.vStep ) + 0.5 );
|
||||||
|
|
||||||
|
Thus adding 0.5 ( for rounding ) can be done in advance
|
||||||
|
*/
|
||||||
|
r0 = r + 0.5;
|
||||||
|
g0 = g + 0.5;
|
||||||
|
b0 = b + 0.5;
|
||||||
|
a0 = a + 0.5;
|
||||||
|
|
||||||
|
rStep = gStep = bStep = aStep = 0.0;
|
||||||
|
posStep = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateSteps( const ColorStop &nextStop )
|
||||||
|
{
|
||||||
|
rStep = nextStop.r - r;
|
||||||
|
gStep = nextStop.g - g;
|
||||||
|
bStep = nextStop.b - b;
|
||||||
|
aStep = nextStop.a - a;
|
||||||
|
posStep = nextStop.pos - pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
double pos;
|
double pos;
|
||||||
QRgb rgb;
|
QRgb rgb;
|
||||||
int r, g, b;
|
int r, g, b, a;
|
||||||
|
|
||||||
|
// precalculated values
|
||||||
|
double rStep, gStep, bStep, aStep;
|
||||||
|
double r0, g0, b0, a0;
|
||||||
|
double posStep;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline int findUpper( double pos ) const;
|
inline int findUpper( double pos ) const;
|
||||||
QVector<ColorStop> _stops;
|
QVector<ColorStop> d_stops;
|
||||||
|
bool d_doAlpha;
|
||||||
};
|
};
|
||||||
|
|
||||||
void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color )
|
void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color )
|
||||||
@ -63,40 +94,48 @@ void QwtLinearColorMap::ColorStops::insert( double pos, const QColor &color )
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
if ( _stops.size() == 0 )
|
if ( d_stops.size() == 0 )
|
||||||
{
|
{
|
||||||
index = 0;
|
index = 0;
|
||||||
_stops.resize( 1 );
|
d_stops.resize( 1 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
index = findUpper( pos );
|
index = findUpper( pos );
|
||||||
if ( index == _stops.size() ||
|
if ( index == d_stops.size() ||
|
||||||
qAbs( _stops[index].pos - pos ) >= 0.001 )
|
qAbs( d_stops[index].pos - pos ) >= 0.001 )
|
||||||
{
|
{
|
||||||
_stops.resize( _stops.size() + 1 );
|
d_stops.resize( d_stops.size() + 1 );
|
||||||
for ( int i = _stops.size() - 1; i > index; i-- )
|
for ( int i = d_stops.size() - 1; i > index; i-- )
|
||||||
_stops[i] = _stops[i-1];
|
d_stops[i] = d_stops[i-1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_stops[index] = ColorStop( pos, color );
|
d_stops[index] = ColorStop( pos, color );
|
||||||
|
if ( color.alpha() != 255 )
|
||||||
|
d_doAlpha = true;
|
||||||
|
|
||||||
|
if ( index > 0 )
|
||||||
|
d_stops[index-1].updateSteps( d_stops[index] );
|
||||||
|
|
||||||
|
if ( index < d_stops.size() - 1 )
|
||||||
|
d_stops[index].updateSteps( d_stops[index+1] );
|
||||||
}
|
}
|
||||||
|
|
||||||
inline QVector<double> QwtLinearColorMap::ColorStops::stops() const
|
inline QVector<double> QwtLinearColorMap::ColorStops::stops() const
|
||||||
{
|
{
|
||||||
QVector<double> positions( _stops.size() );
|
QVector<double> positions( d_stops.size() );
|
||||||
for ( int i = 0; i < _stops.size(); i++ )
|
for ( int i = 0; i < d_stops.size(); i++ )
|
||||||
positions[i] = _stops[i].pos;
|
positions[i] = d_stops[i].pos;
|
||||||
return positions;
|
return positions;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const
|
inline int QwtLinearColorMap::ColorStops::findUpper( double pos ) const
|
||||||
{
|
{
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int n = _stops.size();
|
int n = d_stops.size();
|
||||||
|
|
||||||
const ColorStop *stops = _stops.data();
|
const ColorStop *stops = d_stops.data();
|
||||||
|
|
||||||
while ( n > 0 )
|
while ( n > 0 )
|
||||||
{
|
{
|
||||||
@ -119,27 +158,41 @@ inline QRgb QwtLinearColorMap::ColorStops::rgb(
|
|||||||
QwtLinearColorMap::Mode mode, double pos ) const
|
QwtLinearColorMap::Mode mode, double pos ) const
|
||||||
{
|
{
|
||||||
if ( pos <= 0.0 )
|
if ( pos <= 0.0 )
|
||||||
return _stops[0].rgb;
|
return d_stops[0].rgb;
|
||||||
if ( pos >= 1.0 )
|
if ( pos >= 1.0 )
|
||||||
return _stops[ _stops.size() - 1 ].rgb;
|
return d_stops[ d_stops.size() - 1 ].rgb;
|
||||||
|
|
||||||
const int index = findUpper( pos );
|
const int index = findUpper( pos );
|
||||||
if ( mode == FixedColors )
|
if ( mode == FixedColors )
|
||||||
{
|
{
|
||||||
return _stops[index-1].rgb;
|
return d_stops[index-1].rgb;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const ColorStop &s1 = _stops[index-1];
|
const ColorStop &s1 = d_stops[index-1];
|
||||||
const ColorStop &s2 = _stops[index];
|
|
||||||
|
|
||||||
const double ratio = ( pos - s1.pos ) / ( s2.pos - s1.pos );
|
const double ratio = ( pos - s1.pos ) / ( s1.posStep );
|
||||||
|
|
||||||
const int r = s1.r + qRound( ratio * ( s2.r - s1.r ) );
|
const int r = int( s1.r0 + ratio * s1.rStep );
|
||||||
const int g = s1.g + qRound( ratio * ( s2.g - s1.g ) );
|
const int g = int( s1.g0 + ratio * s1.gStep );
|
||||||
const int b = s1.b + qRound( ratio * ( s2.b - s1.b ) );
|
const int b = int( s1.b0 + ratio * s1.bStep );
|
||||||
|
|
||||||
return qRgb( r, g, b );
|
if ( d_doAlpha )
|
||||||
|
{
|
||||||
|
if ( s1.aStep )
|
||||||
|
{
|
||||||
|
const int a = int( s1.a0 + ratio * s1.aStep );
|
||||||
|
return qRgba( r, g, b, a );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return qRgba( r, g, b, s1.a );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return qRgb( r, g, b );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -316,14 +369,13 @@ QRgb QwtLinearColorMap::rgb(
|
|||||||
const QwtInterval &interval, double value ) const
|
const QwtInterval &interval, double value ) const
|
||||||
{
|
{
|
||||||
if ( qIsNaN(value) )
|
if ( qIsNaN(value) )
|
||||||
return qRgba(0, 0, 0, 0);
|
return 0u;
|
||||||
|
|
||||||
const double width = interval.width();
|
const double width = interval.width();
|
||||||
|
if ( width <= 0.0 )
|
||||||
|
return 0u;
|
||||||
|
|
||||||
double ratio = 0.0;
|
const double ratio = ( value - interval.minValue() ) / width;
|
||||||
if ( width > 0.0 )
|
|
||||||
ratio = ( value - interval.minValue() ) / width;
|
|
||||||
|
|
||||||
return d_data->colorStops.rgb( d_data->mode, ratio );
|
return d_data->colorStops.rgb( d_data->mode, ratio );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +404,7 @@ unsigned char QwtLinearColorMap::colorIndex(
|
|||||||
if ( d_data->mode == FixedColors )
|
if ( d_data->mode == FixedColors )
|
||||||
index = static_cast<unsigned char>( ratio * 255 ); // always floor
|
index = static_cast<unsigned char>( ratio * 255 ); // always floor
|
||||||
else
|
else
|
||||||
index = static_cast<unsigned char>( qRound( ratio * 255 ) );
|
index = static_cast<unsigned char>( ratio * 255 + 0.5 );
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
@ -362,6 +414,7 @@ class QwtAlphaColorMap::PrivateData
|
|||||||
public:
|
public:
|
||||||
QColor color;
|
QColor color;
|
||||||
QRgb rgb;
|
QRgb rgb;
|
||||||
|
QRgb rgbMax;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -373,8 +426,7 @@ QwtAlphaColorMap::QwtAlphaColorMap( const QColor &color ):
|
|||||||
QwtColorMap( QwtColorMap::RGB )
|
QwtColorMap( QwtColorMap::RGB )
|
||||||
{
|
{
|
||||||
d_data = new PrivateData;
|
d_data = new PrivateData;
|
||||||
d_data->color = color;
|
setColor( color );
|
||||||
d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Destructor
|
//! Destructor
|
||||||
@ -392,7 +444,8 @@ QwtAlphaColorMap::~QwtAlphaColorMap()
|
|||||||
void QwtAlphaColorMap::setColor( const QColor &color )
|
void QwtAlphaColorMap::setColor( const QColor &color )
|
||||||
{
|
{
|
||||||
d_data->color = color;
|
d_data->color = color;
|
||||||
d_data->rgb = color.rgb();
|
d_data->rgb = color.rgb() & qRgba( 255, 255, 255, 0 );
|
||||||
|
d_data->rgbMax = d_data->rgb | ( 255 << 24 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -415,19 +468,21 @@ QColor QwtAlphaColorMap::color() const
|
|||||||
*/
|
*/
|
||||||
QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const
|
QRgb QwtAlphaColorMap::rgb( const QwtInterval &interval, double value ) const
|
||||||
{
|
{
|
||||||
const double width = interval.width();
|
if ( qIsNaN(value) )
|
||||||
if ( !qIsNaN(value) && width >= 0.0 )
|
return 0u;
|
||||||
{
|
|
||||||
const double ratio = ( value - interval.minValue() ) / width;
|
|
||||||
int alpha = qRound( 255 * ratio );
|
|
||||||
if ( alpha < 0 )
|
|
||||||
alpha = 0;
|
|
||||||
if ( alpha > 255 )
|
|
||||||
alpha = 255;
|
|
||||||
|
|
||||||
return d_data->rgb | ( alpha << 24 );
|
const double width = interval.width();
|
||||||
}
|
if ( width <= 0.0 )
|
||||||
return d_data->rgb;
|
return 0u;
|
||||||
|
|
||||||
|
if ( value <= interval.minValue() )
|
||||||
|
return d_data->rgb;
|
||||||
|
|
||||||
|
if ( value >= interval.maxValue() )
|
||||||
|
return d_data->rgbMax;
|
||||||
|
|
||||||
|
const double ratio = ( value - interval.minValue() ) / width;
|
||||||
|
return d_data->rgb | ( qRound( 255 * ratio ) << 24 );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -179,7 +179,7 @@ inline QColor QwtColorMap::color(
|
|||||||
{
|
{
|
||||||
if ( d_format == RGB )
|
if ( d_format == RGB )
|
||||||
{
|
{
|
||||||
return QColor( rgb( interval, value ) );
|
return QColor::fromRgba( rgb( interval, value ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
|
* Qwt Widget Library
|
||||||
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "qwt_date.h"
|
#include "qwt_date.h"
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
#include <qlocale.h>
|
#include <qlocale.h>
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
|
* Qwt Widget Library
|
||||||
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "qwt_date_scale_draw.h"
|
#include "qwt_date_scale_draw.h"
|
||||||
|
|
||||||
class QwtDateScaleDraw::PrivateData
|
class QwtDateScaleDraw::PrivateData
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
|
* Qwt Widget Library
|
||||||
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
#ifndef _QWT_DATE_SCALE_DRAW_H_
|
#ifndef _QWT_DATE_SCALE_DRAW_H_
|
||||||
#define _QWT_DATE_SCALE_DRAW_H_ 1
|
#define _QWT_DATE_SCALE_DRAW_H_ 1
|
||||||
|
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
|
* Qwt Widget Library
|
||||||
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
#include "qwt_date_scale_engine.h"
|
#include "qwt_date_scale_engine.h"
|
||||||
#include "qwt_math.h"
|
#include "qwt_math.h"
|
||||||
#include "qwt_transform.h"
|
#include "qwt_transform.h"
|
||||||
|
@ -1,3 +1,12 @@
|
|||||||
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
|
* Qwt Widget Library
|
||||||
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
#ifndef _QWT_DATE_SCALE_ENGINE_H_
|
#ifndef _QWT_DATE_SCALE_ENGINE_H_
|
||||||
#define _QWT_DATE_SCALE_ENGINE_H_ 1
|
#define _QWT_DATE_SCALE_ENGINE_H_ 1
|
||||||
|
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
|
|
||||||
// QWT_VERSION is (major << 16) + (minor << 8) + patch.
|
// QWT_VERSION is (major << 16) + (minor << 8) + patch.
|
||||||
|
|
||||||
#define QWT_VERSION 0x060101
|
#define QWT_VERSION 0x060102
|
||||||
#define QWT_VERSION_STR "6.1.1"
|
#define QWT_VERSION_STR "6.1.2"
|
||||||
|
|
||||||
#if defined(_MSC_VER) /* MSVC Compiler */
|
#if defined(_MSC_VER) /* MSVC Compiler */
|
||||||
/* template-class specialization 'identifier' is already instantiated */
|
/* template-class specialization 'identifier' is already instantiated */
|
||||||
|
@ -416,6 +416,16 @@ void QwtLegend::updateLegend( const QVariant &itemInfo,
|
|||||||
if ( contentsLayout )
|
if ( contentsLayout )
|
||||||
contentsLayout->addWidget( widget );
|
contentsLayout->addWidget( widget );
|
||||||
|
|
||||||
|
if ( isVisible() )
|
||||||
|
{
|
||||||
|
// QLayout does a delayed show, with the effect, that
|
||||||
|
// the size hint will be wrong, when applications
|
||||||
|
// call replot() right after changing the list
|
||||||
|
// of plot items. So we better do the show now.
|
||||||
|
|
||||||
|
widget->setVisible( true );
|
||||||
|
}
|
||||||
|
|
||||||
widgetList += widget;
|
widgetList += widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,13 +134,13 @@ inline double qwtFastAtan2( double y, double x )
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate degrees into radians
|
//! Translate degrees into radians
|
||||||
inline double qwtRadians( double degrees )
|
inline double qwtRadians( double degrees )
|
||||||
{
|
{
|
||||||
return degrees * M_PI / 180.0;
|
return degrees * M_PI / 180.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate radians into degrees
|
//! Translate radians into degrees
|
||||||
inline double qwtDegrees( double degrees )
|
inline double qwtDegrees( double degrees )
|
||||||
{
|
{
|
||||||
return degrees * 180.0 / M_PI;
|
return degrees * 180.0 / M_PI;
|
||||||
|
@ -84,7 +84,8 @@ static inline void qwtDrawPolyline( QPainter *painter,
|
|||||||
|
|
||||||
if ( doSplit )
|
if ( doSplit )
|
||||||
{
|
{
|
||||||
const int splitSize = 20;
|
const int splitSize = 6;
|
||||||
|
|
||||||
for ( int i = 0; i < pointCount; i += splitSize )
|
for ( int i = 0; i < pointCount; i += splitSize )
|
||||||
{
|
{
|
||||||
const int n = qMin( splitSize + 1, pointCount - i );
|
const int n = qMin( splitSize + 1, pointCount - i );
|
||||||
@ -92,7 +93,9 @@ static inline void qwtDrawPolyline( QPainter *painter,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
painter->drawPolyline( points, pointCount );
|
painter->drawPolyline( points, pointCount );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline QSize qwtScreenResolution()
|
static inline QSize qwtScreenResolution()
|
||||||
@ -1096,6 +1099,8 @@ void QwtPainter::drawColorBar( QPainter *painter,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
QPixmap pixmap( devRect.size() );
|
QPixmap pixmap( devRect.size() );
|
||||||
|
pixmap.fill( Qt::transparent );
|
||||||
|
|
||||||
QPainter pmPainter( &pixmap );
|
QPainter pmPainter( &pixmap );
|
||||||
pmPainter.translate( -devRect.x(), -devRect.y() );
|
pmPainter.translate( -devRect.x(), -devRect.y() );
|
||||||
|
|
||||||
@ -1127,7 +1132,7 @@ void QwtPainter::drawColorBar( QPainter *painter,
|
|||||||
const double value = sMap.invTransform( y );
|
const double value = sMap.invTransform( y );
|
||||||
|
|
||||||
if ( colorMap.format() == QwtColorMap::RGB )
|
if ( colorMap.format() == QwtColorMap::RGB )
|
||||||
c.setRgb( colorMap.rgb( interval, value ) );
|
c.setRgba( colorMap.rgb( interval, value ) );
|
||||||
else
|
else
|
||||||
c = colorTable[colorMap.colorIndex( interval, value )];
|
c = colorTable[colorMap.colorIndex( interval, value )];
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -23,6 +23,12 @@
|
|||||||
#include <qtconcurrentrun.h>
|
#include <qtconcurrentrun.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DEBUG_RENDER 0
|
||||||
|
|
||||||
|
#if DEBUG_RENDER
|
||||||
|
#include <QElapsedTimer>
|
||||||
|
#endif
|
||||||
|
|
||||||
class QwtPlotSpectrogram::PrivateData
|
class QwtPlotSpectrogram::PrivateData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -416,6 +422,11 @@ QImage QwtPlotSpectrogram::renderImage(
|
|||||||
|
|
||||||
d_data->data->initRaster( area, image.size() );
|
d_data->data->initRaster( area, image.size() );
|
||||||
|
|
||||||
|
#if DEBUG_RENDER
|
||||||
|
QElapsedTimer time;
|
||||||
|
time.start();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE)
|
#if QT_VERSION >= 0x040400 && !defined(QT_NO_QFUTURE)
|
||||||
uint numThreads = renderThreadCount();
|
uint numThreads = renderThreadCount();
|
||||||
|
|
||||||
@ -451,6 +462,11 @@ QImage QwtPlotSpectrogram::renderImage(
|
|||||||
renderTile( xMap, yMap, tile, &image );
|
renderTile( xMap, yMap, tile, &image );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if DEBUG_RENDER
|
||||||
|
const qint64 elapsed = time.elapsed();
|
||||||
|
qDebug() << "renderImage" << imageSize << elapsed;
|
||||||
|
#endif
|
||||||
|
|
||||||
d_data->data->discardRaster();
|
d_data->data->discardRaster();
|
||||||
|
|
||||||
return image;
|
return image;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -1043,6 +1043,9 @@ void QwtLogScaleEngine::buildMinorTicks(
|
|||||||
|
|
||||||
if ( s >= 1.0 )
|
if ( s >= 1.0 )
|
||||||
{
|
{
|
||||||
|
if ( !qFuzzyCompare( s, 1.0 ) )
|
||||||
|
minorTicks += v * s;
|
||||||
|
|
||||||
for ( int j = 2; j < numSteps; j++ )
|
for ( int j = 2; j < numSteps; j++ )
|
||||||
{
|
{
|
||||||
minorTicks += v * j * s;
|
minorTicks += v * j * s;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||||
* Qwt Widget Library
|
* Qwt Widget Library
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
* Copyright (C) 1997 Josef Wilgen
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
* Copyright (C) 2002 Uwe Rathmann
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
* modify it under the terms of the Qwt License, Version 1.0
|
||||||
|
@ -331,7 +331,7 @@ void QwtThermo::layoutThermo( bool update_geometry )
|
|||||||
scaleDraw()->move( from, tRect.bottom() + bw );
|
scaleDraw()->move( from, tRect.bottom() + bw );
|
||||||
}
|
}
|
||||||
|
|
||||||
scaleDraw()->setLength( to - from );
|
scaleDraw()->setLength( qMax( to - from, 0 ) );
|
||||||
}
|
}
|
||||||
else // Qt::Vertical
|
else // Qt::Vertical
|
||||||
{
|
{
|
||||||
@ -364,7 +364,7 @@ void QwtThermo::layoutThermo( bool update_geometry )
|
|||||||
scaleDraw()->move( tRect.left() - bw, from );
|
scaleDraw()->move( tRect.left() - bw, from );
|
||||||
}
|
}
|
||||||
|
|
||||||
scaleDraw()->setLength( to - from );
|
scaleDraw()->setLength( qMax( to - from, 0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( update_geometry )
|
if ( update_geometry )
|
||||||
|
@ -14,12 +14,24 @@
|
|||||||
#define qExp(x) ::exp(x)
|
#define qExp(x) ::exp(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050400
|
||||||
|
|
||||||
|
//! Smallest allowed value for logarithmic scales: 1.0e-150
|
||||||
|
const double QwtLogTransform::LogMin = 1.0e-150;
|
||||||
|
|
||||||
|
//! Largest allowed value for logarithmic scales: 1.0e150
|
||||||
|
const double QwtLogTransform::LogMax = 1.0e150;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
//! Smallest allowed value for logarithmic scales: 1.0e-150
|
//! Smallest allowed value for logarithmic scales: 1.0e-150
|
||||||
QT_STATIC_CONST_IMPL double QwtLogTransform::LogMin = 1.0e-150;
|
QT_STATIC_CONST_IMPL double QwtLogTransform::LogMin = 1.0e-150;
|
||||||
|
|
||||||
//! Largest allowed value for logarithmic scales: 1.0e150
|
//! Largest allowed value for logarithmic scales: 1.0e150
|
||||||
QT_STATIC_CONST_IMPL double QwtLogTransform::LogMax = 1.0e150;
|
QT_STATIC_CONST_IMPL double QwtLogTransform::LogMax = 1.0e150;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//! Constructor
|
//! Constructor
|
||||||
QwtTransform::QwtTransform()
|
QwtTransform::QwtTransform()
|
||||||
{
|
{
|
||||||
|
@ -107,8 +107,13 @@ public:
|
|||||||
|
|
||||||
virtual QwtTransform *copy() const;
|
virtual QwtTransform *copy() const;
|
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050400
|
||||||
|
static const double LogMin;
|
||||||
|
static const double LogMax;
|
||||||
|
#else
|
||||||
QT_STATIC_CONST double LogMin;
|
QT_STATIC_CONST double LogMin;
|
||||||
QT_STATIC_CONST double LogMax;
|
QT_STATIC_CONST double LogMax;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -14,22 +14,22 @@
|
|||||||
|
|
||||||
# qmake project file for building the qwt libraries
|
# qmake project file for building the qwt libraries
|
||||||
|
|
||||||
# QWT_ROOT = $${PWD}/..
|
QWT_ROOT = $${PWD}/..
|
||||||
# include( $${QWT_ROOT}/qwtconfig.pri )
|
include( $${QWT_ROOT}/qwtconfig.pri )
|
||||||
# include( $${QWT_ROOT}/qwtbuild.pri )
|
# include( $${QWT_ROOT}/qwtbuild.pri )
|
||||||
# include( $${QWT_ROOT}/qwtfunctions.pri )
|
# include( $${QWT_ROOT}/qwtfunctions.pri )
|
||||||
|
|
||||||
|
include(../../../openpilotgcslibrary.pri)
|
||||||
|
|
||||||
# QWT_OUT_ROOT = $${OUT_PWD}/..
|
# QWT_OUT_ROOT = $${OUT_PWD}/..
|
||||||
|
|
||||||
TEMPLATE = lib
|
TEMPLATE = lib
|
||||||
# TARGET = $$qwtLibraryTarget(qwt)
|
# TARGET = $$qwtLibraryTarget(qwt)
|
||||||
TARGET = Qwt
|
TARGET = Qwt
|
||||||
QT += printsupport
|
QT += printsupport
|
||||||
# DESTDIR = $${QWT_OUT_ROOT}/lib
|
|
||||||
DEFINES += QWT_LIBRARY
|
DEFINES += QWT_LIBRARY
|
||||||
|
|
||||||
include(../../../openpilotgcslibrary.pri)
|
# DESTDIR = $${QWT_OUT_ROOT}/lib
|
||||||
include( ../qwtconfig.pri )
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtDll) {
|
contains(QWT_CONFIG, QwtDll) {
|
||||||
|
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
################################################################
|
|
||||||
# Qwt Widget Library
|
|
||||||
# Copyright (C) 1997 Josef Wilgen
|
|
||||||
# Copyright (C) 2002 Uwe Rathmann
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
################################################################
|
|
||||||
|
|
||||||
message(The qwtmathml library contains code of the MML Widget from the Qt solutions package.)
|
|
||||||
message(Beside the Qwt license you also have to take care of its license. )
|
|
||||||
|
|
||||||
include( $${PWD}/../textengines.pri )
|
|
||||||
|
|
||||||
TARGET = $$qwtLibraryTarget(qwtmathml)
|
|
||||||
QT += xml
|
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4) {
|
|
||||||
|
|
||||||
QT += widgets
|
|
||||||
}
|
|
||||||
|
|
||||||
HEADERS = \
|
|
||||||
qwt_mathml_text_engine.h
|
|
||||||
|
|
||||||
SOURCES = \
|
|
||||||
qwt_mathml_text_engine.cpp
|
|
||||||
|
|
||||||
# qwt_mml_document.h/qwt_mml_document.cpp has been stripped down from
|
|
||||||
# the mathml widgets offered in the Qt solutions package.
|
|
||||||
|
|
||||||
HEADERS += qwt_mml_document.h
|
|
||||||
SOURCES += qwt_mml_document.cpp
|
|
||||||
|
|
||||||
qwtmathmlspec.files = qwtmathml.prf
|
|
||||||
qwtmathmlspec.path = $${QWT_INSTALL_FEATURES}
|
|
||||||
|
|
||||||
INSTALLS += qwtmathmlspec
|
|
||||||
|
|
||||||
CONFIG(lib_bundle) {
|
|
||||||
|
|
||||||
FRAMEWORK_HEADERS.version = Versions
|
|
||||||
FRAMEWORK_HEADERS.files = qwt_mathml_text_engine.h
|
|
||||||
FRAMEWORK_HEADERS.path = Headers
|
|
||||||
QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
headers.files = qwt_mathml_text_engine.h
|
|
||||||
headers.path = $${QWT_INSTALL_HEADERS}
|
|
||||||
INSTALLS += headers
|
|
||||||
}
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtPkgConfig) {
|
|
||||||
|
|
||||||
CONFIG += create_pc create_prl no_install_prl
|
|
||||||
|
|
||||||
QMAKE_PKGCONFIG_NAME = qwtmathml
|
|
||||||
QMAKE_PKGCONFIG_DESCRIPTION = Qwt MathML renderer
|
|
||||||
|
|
||||||
QMAKE_PKGCONFIG_LIBDIR = $${QWT_INSTALL_LIBS}
|
|
||||||
QMAKE_PKGCONFIG_INCDIR = $${QWT_INSTALL_HEADERS}
|
|
||||||
|
|
||||||
# QMAKE_PKGCONFIG_DESTDIR is buggy, in combination
|
|
||||||
# with including pri files: better don't use it
|
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4) {
|
|
||||||
|
|
||||||
QMAKE_PKGCONFIG_REQUIRES = Qt5Gui Qt5Widgets Qt5Xml
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
QMAKE_PKGCONFIG_REQUIRES = QtGui QtXml
|
|
||||||
}
|
|
||||||
|
|
||||||
QMAKE_DISTCLEAN += $${DESTDIR}/$${QMAKE_PKGCONFIG_NAME}.pc
|
|
||||||
QMAKE_DISTCLEAN += $${DESTDIR}/libqwtmathml.prl
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
qwt_mml_document.h/qwt_mml_document.cpp have been stripped down from
|
|
||||||
"MML Widget" package of the solutions package, that is distributed under
|
|
||||||
the following licenses:
|
|
||||||
|
|
||||||
-----------------------------------------------------------------
|
|
||||||
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
||||||
All rights reserved.
|
|
||||||
Contact: Nokia Corporation (qt-info@nokia.com)
|
|
||||||
|
|
||||||
Commercial Usage
|
|
||||||
Licensees holding valid Qt Commercial licenses may use this file in
|
|
||||||
accordance with the Qt Solutions Commercial License Agreement provided
|
|
||||||
with the Software or, alternatively, in accordance with the terms
|
|
||||||
contained in a written agreement between you and Nokia.
|
|
||||||
|
|
||||||
GNU Lesser General Public License Usage
|
|
||||||
Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
General Public License version 2.1 as published by the Free Software
|
|
||||||
Foundation and appearing in the file LICENSE.LGPL included in the
|
|
||||||
packaging of this file. Please review the following information to
|
|
||||||
ensure the GNU Lesser General Public License version 2.1 requirements
|
|
||||||
will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
||||||
|
|
||||||
In addition, as a special exception, Nokia gives you certain
|
|
||||||
additional rights. These rights are described in the Nokia Qt LGPL
|
|
||||||
Exception version 1.1, included in the file LGPL_EXCEPTION.txt in this
|
|
||||||
package.
|
|
||||||
|
|
||||||
GNU General Public License Usage
|
|
||||||
Alternatively, this file may be used under the terms of the GNU
|
|
||||||
General Public License version 3.0 as published by the Free Software
|
|
||||||
Foundation and appearing in the file LICENSE.GPL included in the
|
|
||||||
packaging of this file. Please review the following information to
|
|
||||||
ensure the GNU General Public License version 3.0 requirements will be
|
|
||||||
met: http://www.gnu.org/copyleft/gpl.html.
|
|
||||||
|
|
||||||
Please note Third Party Software included with Qt Solutions may impose
|
|
||||||
additional restrictions and it is the user's responsibility to ensure
|
|
||||||
that they have met the licensing requirements of the GPL, LGPL, or Qt
|
|
||||||
Solutions Commercial license and the relevant license of the Third
|
|
||||||
Party Software they are using.
|
|
||||||
|
|
||||||
If you are unsure which license is appropriate for your use, please
|
|
||||||
contact Nokia at qt-info@nokia.com.
|
|
@ -1,132 +0,0 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
|
||||||
* Qwt Widget Library
|
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
// vim: expandtab
|
|
||||||
|
|
||||||
#include <qstring.h>
|
|
||||||
#include <qpainter.h>
|
|
||||||
#include "qwt_mathml_text_engine.h"
|
|
||||||
#include "qwt_mml_document.h"
|
|
||||||
|
|
||||||
//! Constructor
|
|
||||||
QwtMathMLTextEngine::QwtMathMLTextEngine()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Destructor
|
|
||||||
QwtMathMLTextEngine::~QwtMathMLTextEngine()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Find the height for a given width
|
|
||||||
|
|
||||||
\param font Font of the text
|
|
||||||
\param flags Bitwise OR of the flags used like in QPainter::drawText
|
|
||||||
\param text Text to be rendered
|
|
||||||
\param width Width
|
|
||||||
|
|
||||||
\return Calculated height
|
|
||||||
*/
|
|
||||||
double QwtMathMLTextEngine::heightForWidth( const QFont& font, int flags,
|
|
||||||
const QString& text, double ) const
|
|
||||||
{
|
|
||||||
return textSize( font, flags, text ).height();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the size, that is needed to render text
|
|
||||||
|
|
||||||
\param font Font of the text
|
|
||||||
\param flags Bitwise OR of the flags used like in QPainter::drawText
|
|
||||||
\param text Text to be rendered
|
|
||||||
|
|
||||||
\return Caluclated size
|
|
||||||
*/
|
|
||||||
QSizeF QwtMathMLTextEngine::textSize( const QFont &font,
|
|
||||||
int flags, const QString& text ) const
|
|
||||||
{
|
|
||||||
Q_UNUSED( flags );
|
|
||||||
|
|
||||||
static QString t;
|
|
||||||
static QSize sz;
|
|
||||||
|
|
||||||
if ( text != t )
|
|
||||||
{
|
|
||||||
QwtMathMLDocument doc;
|
|
||||||
doc.setContent( text );
|
|
||||||
doc.setBaseFontPointSize( font.pointSize() );
|
|
||||||
|
|
||||||
sz = doc.size();
|
|
||||||
t = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Return margins around the texts
|
|
||||||
|
|
||||||
\param left Return 0
|
|
||||||
\param right Return 0
|
|
||||||
\param top Return 0
|
|
||||||
\param bottom Return 0
|
|
||||||
*/
|
|
||||||
void QwtMathMLTextEngine::textMargins( const QFont &, const QString &,
|
|
||||||
double &left, double &right, double &top, double &bottom ) const
|
|
||||||
{
|
|
||||||
left = right = top = bottom = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Draw the text in a clipping rectangle
|
|
||||||
|
|
||||||
\param painter Painter
|
|
||||||
\param rect Clipping rectangle
|
|
||||||
\param flags Bitwise OR of the flags like in for QPainter::drawText
|
|
||||||
\param text Text to be rendered
|
|
||||||
*/
|
|
||||||
void QwtMathMLTextEngine::draw( QPainter *painter, const QRectF &rect,
|
|
||||||
int flags, const QString& text ) const
|
|
||||||
{
|
|
||||||
QwtMathMLDocument doc;
|
|
||||||
doc.setContent( text );
|
|
||||||
doc.setBaseFontPointSize( painter->font().pointSize() );
|
|
||||||
|
|
||||||
const QSizeF docSize = doc.size();
|
|
||||||
|
|
||||||
QPointF pos = rect.topLeft();
|
|
||||||
if ( rect.width() > docSize.width() )
|
|
||||||
{
|
|
||||||
if ( flags & Qt::AlignRight )
|
|
||||||
pos.setX( rect.right() - docSize.width() );
|
|
||||||
if ( flags & Qt::AlignHCenter )
|
|
||||||
pos.setX( rect.center().x() - docSize.width() / 2 );
|
|
||||||
}
|
|
||||||
if ( rect.height() > docSize.height() )
|
|
||||||
{
|
|
||||||
if ( flags & Qt::AlignBottom )
|
|
||||||
pos.setY( rect.bottom() - docSize.height() );
|
|
||||||
if ( flags & Qt::AlignVCenter )
|
|
||||||
pos.setY( rect.center().y() - docSize.height() / 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
doc.paint( painter, pos.toPoint() );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Test if a string can be rendered by QwtMathMLTextEngine
|
|
||||||
|
|
||||||
\param text Text to be tested
|
|
||||||
\return true, if text begins with "<math>".
|
|
||||||
*/
|
|
||||||
bool QwtMathMLTextEngine::mightRender( const QString &text ) const
|
|
||||||
{
|
|
||||||
return text.trimmed().startsWith( "<math" );
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
|
||||||
* Qwt Widget Library
|
|
||||||
* Copyright (C) 1997 Josef Wilgen
|
|
||||||
* Copyright (C) 2003 Uwe Rathmann
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
// vim: expandtab
|
|
||||||
|
|
||||||
#ifndef QWT_MATHML_TEXT_ENGINE_H
|
|
||||||
#define QWT_MATHML_TEXT_ENGINE_H 1
|
|
||||||
|
|
||||||
#include "qwt_text_engine.h"
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\brief Text Engine for the MathML renderer of the Qt solutions package.
|
|
||||||
|
|
||||||
To enable MathML support the following code needs to be added to the
|
|
||||||
application:
|
|
||||||
\verbatim
|
|
||||||
#include <qwt_mathml_text_engine.h>
|
|
||||||
|
|
||||||
QwtText::setTextEngine(QwtText::MathMLText, new QwtMathMLTextEngine());
|
|
||||||
\endverbatim
|
|
||||||
|
|
||||||
\sa QwtTextEngine, QwtText::setTextEngine
|
|
||||||
\warning Unfortunately the MathML renderer doesn't support rotating of texts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class QWT_EXPORT QwtMathMLTextEngine: public QwtTextEngine
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMathMLTextEngine();
|
|
||||||
virtual ~QwtMathMLTextEngine();
|
|
||||||
|
|
||||||
virtual double heightForWidth( const QFont &font, int flags,
|
|
||||||
const QString &text, double width ) const;
|
|
||||||
|
|
||||||
virtual QSizeF textSize( const QFont &font, int flags,
|
|
||||||
const QString &text ) const;
|
|
||||||
|
|
||||||
virtual void draw( QPainter *painter, const QRectF &rect,
|
|
||||||
int flags, const QString &text ) const;
|
|
||||||
|
|
||||||
virtual bool mightRender( const QString & ) const;
|
|
||||||
|
|
||||||
virtual void textMargins( const QFont &, const QString &,
|
|
||||||
double &left, double &right, double &top, double &bottom ) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,6261 +0,0 @@
|
|||||||
#include <QApplication>
|
|
||||||
#include <QMap>
|
|
||||||
#include <QDesktopWidget>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QDomNode>
|
|
||||||
#include <QDebug>
|
|
||||||
|
|
||||||
#include "qwt_mml_document.h"
|
|
||||||
|
|
||||||
// *******************************************************************
|
|
||||||
// Declarations
|
|
||||||
// *******************************************************************
|
|
||||||
|
|
||||||
#define ROUND(a) (int)((a)+.5)
|
|
||||||
|
|
||||||
static bool g_draw_frames = false;
|
|
||||||
static const double g_mfrac_spacing = 0.1;
|
|
||||||
static const double g_mroot_base_margin = 0.1;
|
|
||||||
static const double g_script_size_multiplier = 0.7071; // sqrt(1/2)
|
|
||||||
static const int g_min_font_point_size = 8;
|
|
||||||
static const QChar g_radical_char = QChar( 0x1A, 0x22 );
|
|
||||||
static const unsigned g_oper_spec_rows = 9;
|
|
||||||
|
|
||||||
struct QwtMml
|
|
||||||
{
|
|
||||||
enum NodeType
|
|
||||||
{
|
|
||||||
NoNode = 0, MiNode, MnNode, MfracNode, MrowNode, MsqrtNode,
|
|
||||||
MrootNode, MsupNode, MsubNode, MsubsupNode, MoNode,
|
|
||||||
MstyleNode, TextNode, MphantomNode, MfencedNode,
|
|
||||||
MtableNode, MtrNode, MtdNode, MoverNode, MunderNode,
|
|
||||||
MunderoverNode, MerrorNode, MtextNode, MpaddedNode,
|
|
||||||
MspaceNode, MalignMarkNode, UnknownNode
|
|
||||||
};
|
|
||||||
|
|
||||||
enum MathVariant
|
|
||||||
{
|
|
||||||
NormalMV = 0x0000,
|
|
||||||
BoldMV = 0x0001,
|
|
||||||
ItalicMV = 0x0002,
|
|
||||||
DoubleStruckMV = 0x0004,
|
|
||||||
ScriptMV = 0x0008,
|
|
||||||
FrakturMV = 0x0010,
|
|
||||||
SansSerifMV = 0x0020,
|
|
||||||
MonospaceMV = 0x0040
|
|
||||||
};
|
|
||||||
|
|
||||||
enum FormType { PrefixForm, InfixForm, PostfixForm };
|
|
||||||
enum ColAlign { ColAlignLeft, ColAlignCenter, ColAlignRight };
|
|
||||||
enum RowAlign { RowAlignTop, RowAlignCenter, RowAlignBottom,
|
|
||||||
RowAlignAxis, RowAlignBaseline
|
|
||||||
};
|
|
||||||
enum FrameType { FrameNone, FrameSolid, FrameDashed };
|
|
||||||
|
|
||||||
struct FrameSpacing
|
|
||||||
{
|
|
||||||
FrameSpacing( int hor = 0, int ver = 0 )
|
|
||||||
: m_hor( hor ), m_ver( ver ) {}
|
|
||||||
int m_hor, m_ver;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct QwtMmlOperSpec
|
|
||||||
{
|
|
||||||
enum StretchDir { NoStretch, HStretch, VStretch, HVStretch };
|
|
||||||
|
|
||||||
const char *name;
|
|
||||||
QwtMml::FormType form;
|
|
||||||
const char *attributes[g_oper_spec_rows];
|
|
||||||
StretchDir stretch_dir;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct QwtMmlNodeSpec
|
|
||||||
{
|
|
||||||
QwtMml::NodeType type;
|
|
||||||
const char *tag;
|
|
||||||
const char *type_str;
|
|
||||||
int child_spec;
|
|
||||||
const char *child_types;
|
|
||||||
const char *attributes;
|
|
||||||
|
|
||||||
enum ChildSpec
|
|
||||||
{
|
|
||||||
ChildAny = -1, // any number of children allowed
|
|
||||||
ChildIgnore = -2, // do not build subexpression of children
|
|
||||||
ImplicitMrow = -3 // if more than one child, build mrow
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct QwtMmlEntitySpec
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *value;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef QMap<QString, QString> QwtMmlAttributeMap;
|
|
||||||
class QwtMmlNode;
|
|
||||||
|
|
||||||
class QwtMmlDocument : public QwtMml
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlDocument();
|
|
||||||
~QwtMmlDocument();
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
bool setContent( QString text, QString *errorMsg = 0,
|
|
||||||
int *errorLine = 0, int *errorColumn = 0 );
|
|
||||||
void paint( QPainter *p, const QPoint &pos ) const;
|
|
||||||
void dump() const;
|
|
||||||
QSize size() const;
|
|
||||||
void layout();
|
|
||||||
|
|
||||||
QString fontName( QwtMathMLDocument::MmlFont type ) const;
|
|
||||||
void setFontName( QwtMathMLDocument::MmlFont type, const QString &name );
|
|
||||||
|
|
||||||
int baseFontPointSize() const
|
|
||||||
{ return m_base_font_point_size; }
|
|
||||||
void setBaseFontPointSize( int size )
|
|
||||||
{ m_base_font_point_size = size; }
|
|
||||||
QColor foregroundColor() const
|
|
||||||
{ return m_foreground_color; }
|
|
||||||
void setForegroundColor( const QColor &color )
|
|
||||||
{ m_foreground_color = color; }
|
|
||||||
QColor backgroundColor() const
|
|
||||||
{ return m_background_color; }
|
|
||||||
void setBackgroundColor( const QColor &color )
|
|
||||||
{ m_background_color = color; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
void _dump( const QwtMmlNode *node, QString &indent ) const;
|
|
||||||
bool insertChild( QwtMmlNode *parent, QwtMmlNode *new_node, QString *errorMsg );
|
|
||||||
|
|
||||||
QwtMmlNode *domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg );
|
|
||||||
QwtMmlNode *createNode( NodeType type, const QwtMmlAttributeMap &mml_attr,
|
|
||||||
const QString &mml_value, QString *errorMsg );
|
|
||||||
QwtMmlNode *createImplicitMrowNode( const QDomNode &dom_node, bool *ok,
|
|
||||||
QString *errorMsg );
|
|
||||||
|
|
||||||
void insertOperator( QwtMmlNode *node, const QString &text );
|
|
||||||
|
|
||||||
QwtMmlNode *m_root_node;
|
|
||||||
|
|
||||||
QString m_normal_font_name;
|
|
||||||
QString m_fraktur_font_name;
|
|
||||||
QString m_sans_serif_font_name;
|
|
||||||
QString m_script_font_name;
|
|
||||||
QString m_monospace_font_name;
|
|
||||||
QString m_doublestruck_font_name;
|
|
||||||
int m_base_font_point_size;
|
|
||||||
QColor m_foreground_color;
|
|
||||||
QColor m_background_color;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlNode : public QwtMml
|
|
||||||
{
|
|
||||||
friend class QwtMmlDocument;
|
|
||||||
|
|
||||||
public:
|
|
||||||
QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map );
|
|
||||||
virtual ~QwtMmlNode();
|
|
||||||
|
|
||||||
// Mml stuff
|
|
||||||
NodeType nodeType() const
|
|
||||||
{ return m_node_type; }
|
|
||||||
|
|
||||||
virtual QString toStr() const;
|
|
||||||
|
|
||||||
void setRelOrigin( const QPoint &rel_origin );
|
|
||||||
QPoint relOrigin() const
|
|
||||||
{ return m_rel_origin; }
|
|
||||||
void stretchTo( const QRect &rect );
|
|
||||||
bool isStretched() const
|
|
||||||
{ return m_stretched; }
|
|
||||||
QPoint devicePoint( const QPoint &p ) const;
|
|
||||||
|
|
||||||
QRect myRect() const
|
|
||||||
{ return m_my_rect; }
|
|
||||||
QRect parentRect() const;
|
|
||||||
virtual QRect deviceRect() const;
|
|
||||||
void updateMyRect();
|
|
||||||
virtual void setMyRect( const QRect &rect )
|
|
||||||
{ m_my_rect = rect; }
|
|
||||||
|
|
||||||
virtual void stretch();
|
|
||||||
virtual void layout();
|
|
||||||
virtual void paint( QPainter *p );
|
|
||||||
|
|
||||||
int basePos() const;
|
|
||||||
int overlinePos() const;
|
|
||||||
int underlinePos() const;
|
|
||||||
int em() const;
|
|
||||||
int ex() const;
|
|
||||||
|
|
||||||
QString explicitAttribute( const QString &name, const QString &def = QString::null ) const;
|
|
||||||
QString inheritAttributeFromMrow( const QString &name, const QString &def = QString::null ) const;
|
|
||||||
|
|
||||||
virtual QFont font() const;
|
|
||||||
virtual QColor color() const;
|
|
||||||
virtual QColor background() const;
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
||||||
|
|
||||||
|
|
||||||
// Node stuff
|
|
||||||
QwtMmlDocument *document() const
|
|
||||||
{ return m_document; }
|
|
||||||
QwtMmlNode *parent() const
|
|
||||||
{ return m_parent; }
|
|
||||||
QwtMmlNode *firstChild() const
|
|
||||||
{ return m_first_child; }
|
|
||||||
QwtMmlNode *nextSibling() const
|
|
||||||
{ return m_next_sibling; }
|
|
||||||
QwtMmlNode *previousSibling() const
|
|
||||||
{ return m_previous_sibling; }
|
|
||||||
QwtMmlNode *lastSibling() const;
|
|
||||||
QwtMmlNode *firstSibling() const;
|
|
||||||
bool isLastSibling() const
|
|
||||||
{ return m_next_sibling == 0; }
|
|
||||||
bool isFirstSibling() const
|
|
||||||
{ return m_previous_sibling == 0; }
|
|
||||||
bool hasChildNodes() const
|
|
||||||
{ return m_first_child != 0; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual void paintSymbol( QPainter *p ) const;
|
|
||||||
virtual QRect symbolRect() const
|
|
||||||
{ return QRect( 0, 0, 0, 0 ); }
|
|
||||||
|
|
||||||
QwtMmlNode *parentWithExplicitAttribute( const QString &name, NodeType type = NoNode );
|
|
||||||
int interpretSpacing( const QString &value, bool *ok ) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QwtMmlAttributeMap m_attribute_map;
|
|
||||||
bool m_stretched;
|
|
||||||
QRect m_my_rect, m_parent_rect;
|
|
||||||
QPoint m_rel_origin;
|
|
||||||
|
|
||||||
NodeType m_node_type;
|
|
||||||
QwtMmlDocument *m_document;
|
|
||||||
|
|
||||||
QwtMmlNode *m_parent,
|
|
||||||
*m_first_child,
|
|
||||||
*m_next_sibling,
|
|
||||||
*m_previous_sibling;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlTokenNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlTokenNode( NodeType type, QwtMmlDocument *document,
|
|
||||||
const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( type, document, attribute_map ) {}
|
|
||||||
|
|
||||||
QString text() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMphantomNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMphantomNode( QwtMmlDocument *document,
|
|
||||||
const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MphantomNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
virtual void paint( QPainter * ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlUnknownNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlUnknownNode( QwtMmlDocument *document,
|
|
||||||
const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( UnknownNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMfencedNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMfencedNode( QwtMmlDocument *document,
|
|
||||||
const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MfencedNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMalignMarkNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMalignMarkNode( QwtMmlDocument *document )
|
|
||||||
: QwtMmlNode( MalignMarkNode, document, QwtMmlAttributeMap() ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMfracNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMfracNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MfracNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
QwtMmlNode *numerator() const;
|
|
||||||
QwtMmlNode *denominator() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual void paintSymbol( QPainter *p ) const;
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMrowNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMrowNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MrowNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlRootBaseNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlRootBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( type, document, attribute_map ) {}
|
|
||||||
|
|
||||||
QwtMmlNode *base() const;
|
|
||||||
QwtMmlNode *index() const;
|
|
||||||
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual void paintSymbol( QPainter *p ) const;
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
int tailWidth() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMrootNode : public QwtMmlRootBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMrootNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlRootBaseNode( MrootNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMsqrtNode : public QwtMmlRootBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMsqrtNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlRootBaseNode( MsqrtNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class QwtMmlTextNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlTextNode( const QString &text, QwtMmlDocument *document );
|
|
||||||
|
|
||||||
virtual QString toStr() const;
|
|
||||||
QString text() const
|
|
||||||
{ return m_text; }
|
|
||||||
|
|
||||||
// TextNodes are not xml elements, so they can't have attributes of
|
|
||||||
// their own. Everything is taken from the parent.
|
|
||||||
virtual QFont font() const
|
|
||||||
{ return parent()->font(); }
|
|
||||||
virtual int scriptlevel( const QwtMmlNode* = 0 ) const
|
|
||||||
{ return parent()->scriptlevel( this ); }
|
|
||||||
virtual QColor color() const
|
|
||||||
{ return parent()->color(); }
|
|
||||||
virtual QColor background() const
|
|
||||||
{ return parent()->background(); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void paintSymbol( QPainter *p ) const;
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
|
|
||||||
QString m_text;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMiNode : public QwtMmlTokenNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMiNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTokenNode( MiNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMnNode : public QwtMmlTokenNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMnNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTokenNode( MnNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlSubsupBaseNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlSubsupBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( type, document, attribute_map ) {}
|
|
||||||
|
|
||||||
QwtMmlNode *base() const;
|
|
||||||
QwtMmlNode *sscript() const;
|
|
||||||
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMsupNode : public QwtMmlSubsupBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlSubsupBaseNode( MsupNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMsubNode : public QwtMmlSubsupBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMsubNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlSubsupBaseNode( MsubNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMsubsupNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMsubsupNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MsubsupNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
QwtMmlNode *base() const;
|
|
||||||
QwtMmlNode *superscript() const;
|
|
||||||
QwtMmlNode *subscript() const;
|
|
||||||
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMoNode : public QwtMmlTokenNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map );
|
|
||||||
|
|
||||||
QString dictionaryAttribute( const QString &name ) const;
|
|
||||||
virtual void stretch();
|
|
||||||
virtual int lspace() const;
|
|
||||||
virtual int rspace() const;
|
|
||||||
|
|
||||||
virtual QString toStr() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
|
|
||||||
virtual FormType form() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
const QwtMmlOperSpec *m_oper_spec;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMstyleNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMstyleNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MstyleNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlTableBaseNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlTableBaseNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( type, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMtableNode : public QwtMmlTableBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMtableNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTableBaseNode( MtableNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
int rowspacing() const;
|
|
||||||
int columnspacing() const;
|
|
||||||
int framespacing_hor() const;
|
|
||||||
int framespacing_ver() const;
|
|
||||||
FrameType frame() const;
|
|
||||||
FrameType columnlines( int idx ) const;
|
|
||||||
FrameType rowlines( int idx ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
virtual void paintSymbol( QPainter *p ) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct CellSizeData
|
|
||||||
{
|
|
||||||
void init( const QwtMmlNode *first_row );
|
|
||||||
QList<int> col_widths, row_heights;
|
|
||||||
int numCols() const { return col_widths.count(); }
|
|
||||||
int numRows() const { return row_heights.count(); }
|
|
||||||
uint colWidthSum() const;
|
|
||||||
uint rowHeightSum() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
CellSizeData m_cell_size_data;
|
|
||||||
int m_content_width, m_content_height;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMtrNode : public QwtMmlTableBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMtrNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTableBaseNode( MtrNode, document, attribute_map ) {}
|
|
||||||
void layoutCells( const QList<int> &col_widths, int col_spc );
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMtdNode : public QwtMmlTableBaseNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMtdNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTableBaseNode( MtdNode, document, attribute_map )
|
|
||||||
{ m_scriptlevel_adjust = 0; }
|
|
||||||
virtual void setMyRect( const QRect &rect );
|
|
||||||
|
|
||||||
ColAlign columnalign();
|
|
||||||
RowAlign rowalign();
|
|
||||||
uint colNum();
|
|
||||||
uint rowNum();
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *child = 0 ) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_scriptlevel_adjust; // added or subtracted to scriptlevel to
|
|
||||||
// make contents fit the cell
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMoverNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MoverNode, document, attribute_map ) {}
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMunderNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMunderNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MunderNode, document, attribute_map ) {}
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMunderoverNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMunderoverNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MunderoverNode, document, attribute_map ) {}
|
|
||||||
virtual int scriptlevel( const QwtMmlNode *node = 0 ) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMerrorNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMerrorNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MerrorNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMtextNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMtextNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MtextNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMpaddedNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMpaddedNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MpaddedNode, document, attribute_map ) {}
|
|
||||||
|
|
||||||
public:
|
|
||||||
int lspace() const;
|
|
||||||
int width() const;
|
|
||||||
int height() const;
|
|
||||||
int depth() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int interpretSpacing( QString value, int base_value, bool *ok ) const;
|
|
||||||
virtual void layoutSymbol();
|
|
||||||
virtual QRect symbolRect() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class QwtMmlMspaceNode : public QwtMmlNode
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
QwtMmlMspaceNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlNode( MspaceNode, document, attribute_map ) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type );
|
|
||||||
static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag );
|
|
||||||
static bool mmlCheckChildType( QwtMml::NodeType parent_type,
|
|
||||||
QwtMml::NodeType child_type, QString *error_str );
|
|
||||||
static bool mmlCheckAttributes( QwtMml::NodeType child_type,
|
|
||||||
const QwtMmlAttributeMap &attr, QString *error_str );
|
|
||||||
static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec );
|
|
||||||
static const QwtMmlOperSpec *mmlFindOperSpec( const QString &name, QwtMml::FormType form );
|
|
||||||
static int interpretSpacing( QString name, int em, int ex, bool *ok );
|
|
||||||
static int interpretPercentSpacing( QString value, int base, bool *ok );
|
|
||||||
static uint interpretMathVariant( const QString &value, bool *ok );
|
|
||||||
static QwtMml::FormType interpretForm( const QString &value, bool *ok );
|
|
||||||
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok );
|
|
||||||
static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok );
|
|
||||||
static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok );
|
|
||||||
static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok );
|
|
||||||
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok );
|
|
||||||
static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex );
|
|
||||||
static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok );
|
|
||||||
static QString interpretListAttr( const QString &value_list, int idx, const QString &def );
|
|
||||||
static QString rectToStr( const QRect &rect );
|
|
||||||
static QString entityDeclarations();
|
|
||||||
|
|
||||||
|
|
||||||
#define MML_ATT_COMMON " class style id xref actiontype "
|
|
||||||
#define MML_ATT_FONTSIZE " fontsize fontweight fontstyle fontfamily color "
|
|
||||||
#define MML_ATT_MATHVARIANT " mathvariant mathsize mathcolor mathbackground "
|
|
||||||
#define MML_ATT_FONTINFO MML_ATT_FONTSIZE MML_ATT_MATHVARIANT
|
|
||||||
#define MML_ATT_OPINFO " form fence separator lspace rspace stretchy symmetric " \
|
|
||||||
" maxsize minsize largeop movablelimits accent "
|
|
||||||
#define MML_ATT_SIZEINFO " width height depth "
|
|
||||||
#define MML_ATT_TABLEINFO " align rowalign columnalign columnwidth groupalign " \
|
|
||||||
" alignmentscope side rowspacing columnspacing rowlines " \
|
|
||||||
" columnlines width frame framespacing equalrows " \
|
|
||||||
" equalcolumns displaystyle "
|
|
||||||
#define MML_ATT_MFRAC " bevelled numalign denomalign linethickness "
|
|
||||||
#define MML_ATT_MSTYLE MML_ATT_FONTINFO MML_ATT_OPINFO \
|
|
||||||
" scriptlevel lquote rquote linethickness displaystyle " \
|
|
||||||
" scriptsizemultiplier scriptminsize background " \
|
|
||||||
" veryverythinmathspace verythinmathspace thinmathspace " \
|
|
||||||
" mediummathspace thickmathspace verythickmathspace " \
|
|
||||||
" veryverythickmathspace open close separators " \
|
|
||||||
" subscriptshift superscriptshift accentunder tableinfo " \
|
|
||||||
" rowspan columnspan edge selection bevelled "
|
|
||||||
#define MML_ATT_MTABLE " align rowalign columnalign groupalign alignmentscope " \
|
|
||||||
" columnwidth width rowspacing columnspacing rowlines columnlines " \
|
|
||||||
" frame framespacing equalrows equalcolumns displaystyle side " \
|
|
||||||
" minlabelspacing "
|
|
||||||
|
|
||||||
static const QwtMmlNodeSpec g_node_spec_data[] =
|
|
||||||
{
|
|
||||||
|
|
||||||
// type tag type_str child_spec child_types attributes ""=none, 0=any
|
|
||||||
// ----------------------- --------------- ------------------- ----------------------- ------------------------ ------------------------------------
|
|
||||||
{ QwtMml::MiNode, "mi", "MiNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO },
|
|
||||||
{ QwtMml::MnNode, "mn", "MnNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO },
|
|
||||||
{ QwtMml::MfracNode, "mfrac", "MfracNode", 2, 0, MML_ATT_COMMON MML_ATT_MFRAC },
|
|
||||||
{ QwtMml::MrowNode, "mrow", "MrowNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " display mode " },
|
|
||||||
{ QwtMml::MsqrtNode, "msqrt", "MsqrtNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
||||||
{ QwtMml::MrootNode, "mroot", "MrootNode", 2, 0, MML_ATT_COMMON },
|
|
||||||
{ QwtMml::MsupNode, "msup", "MsupNode", 2, 0, MML_ATT_COMMON " subscriptshift " },
|
|
||||||
{ QwtMml::MsubNode, "msub", "MsubNode", 2, 0, MML_ATT_COMMON " superscriptshift " },
|
|
||||||
{ QwtMml::MsubsupNode, "msubsup", "MsubsupNode", 3, 0, MML_ATT_COMMON " subscriptshift superscriptshift " },
|
|
||||||
{ QwtMml::MoNode, "mo", "MoNode", QwtMmlNodeSpec::ChildAny, " TextNode MalignMark ", MML_ATT_COMMON MML_ATT_FONTINFO MML_ATT_OPINFO },
|
|
||||||
{ QwtMml::MstyleNode, "mstyle", "MstyleNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON MML_ATT_MSTYLE },
|
|
||||||
{ QwtMml::MphantomNode, "mphantom", "MphantomNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
||||||
{ QwtMml::MalignMarkNode, "malignmark", "MalignMarkNode", 0, 0, "" },
|
|
||||||
{ QwtMml::MfencedNode, "mfenced", "MfencedNode", QwtMmlNodeSpec::ChildAny, 0, MML_ATT_COMMON " open close separators " },
|
|
||||||
{ QwtMml::MtableNode, "mtable", "MtableNode", QwtMmlNodeSpec::ChildAny, " MtrNode ", MML_ATT_COMMON MML_ATT_MTABLE },
|
|
||||||
{ QwtMml::MtrNode, "mtr", "MtrNode", QwtMmlNodeSpec::ChildAny, " MtdNode ", MML_ATT_COMMON " rowalign columnalign groupalign " },
|
|
||||||
{ QwtMml::MtdNode, "mtd", "MtdNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " rowspan columnspan rowalign columnalign groupalign " },
|
|
||||||
{ QwtMml::MoverNode, "mover", "MoverNode", 2, 0, MML_ATT_COMMON " accent " },
|
|
||||||
{ QwtMml::MunderNode, "munder", "MunderNode", 2, 0, MML_ATT_COMMON " accentunder " },
|
|
||||||
{ QwtMml::MunderoverNode, "munderover", "MunderoverNode", 3, 0, MML_ATT_COMMON " accentunder accent " },
|
|
||||||
{ QwtMml::MerrorNode, "merror", "MerrorNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON },
|
|
||||||
{ QwtMml::MtextNode, "mtext", "MtextNode", 1, " TextNode ", MML_ATT_COMMON " width height depth linebreak " },
|
|
||||||
{ QwtMml::MpaddedNode, "mpadded", "MpaddedNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth lspace " },
|
|
||||||
{ QwtMml::MspaceNode, "mspace", "MspaceNode", QwtMmlNodeSpec::ImplicitMrow, 0, MML_ATT_COMMON " width height depth linebreak " },
|
|
||||||
{ QwtMml::TextNode, 0, "TextNode", QwtMmlNodeSpec::ChildIgnore, 0, "" },
|
|
||||||
{ QwtMml::UnknownNode, 0, "UnknownNode", QwtMmlNodeSpec::ChildAny, 0, 0 },
|
|
||||||
{ QwtMml::NoNode, 0, 0, 0, 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *g_oper_spec_names[g_oper_spec_rows] = { "accent", "fence", "largeop", "lspace", "minsize", "movablelimits", "rspace", "separator", "stretchy" /* stretchdir */ };
|
|
||||||
static const QwtMmlOperSpec g_oper_spec_data[] =
|
|
||||||
{
|
|
||||||
|
|
||||||
{ "!!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!!"
|
|
||||||
{ "!" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!"
|
|
||||||
{ "!=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "!="
|
|
||||||
{ "⩓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩓"
|
|
||||||
{ "⁡" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁡"
|
|
||||||
{ "≔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≔"
|
|
||||||
{ "∖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "∖"
|
|
||||||
{ "∵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∵"
|
|
||||||
{ "˘" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˘"
|
|
||||||
{ "⋒" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋒"
|
|
||||||
{ "ⅅ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⅅ"
|
|
||||||
{ "¸" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¸"
|
|
||||||
{ "·" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "·"
|
|
||||||
{ "⊙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊙"
|
|
||||||
{ "⊖" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊖"
|
|
||||||
{ "⊕" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊕"
|
|
||||||
{ "⊗" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊗"
|
|
||||||
{ "∲" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true"}, QwtMmlOperSpec::VStretch }, // ∲"
|
|
||||||
{ "”" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ”"
|
|
||||||
{ "’" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "’"
|
|
||||||
{ "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷"
|
|
||||||
{ "≡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≡"
|
|
||||||
{ "∮" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "∮"
|
|
||||||
{ "∐" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∐"
|
|
||||||
{ "∳", QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // &CounterClockwiseContourInteg
|
|
||||||
{ "⨯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⨯"
|
|
||||||
{ "⋓" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋓"
|
|
||||||
{ "≍" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≍"
|
|
||||||
{ "∇" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∇"
|
|
||||||
{ "´" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "´"
|
|
||||||
{ "˙" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "˙"
|
|
||||||
{ "˝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ˝"
|
|
||||||
{ "`" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "`"
|
|
||||||
{ "&DiacriticalLeftArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftArrow;"
|
|
||||||
{ "&DiacriticalLeftRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightArrow;"
|
|
||||||
{ "&DiacriticalLeftRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftRightVector;"
|
|
||||||
{ "&DiacriticalLeftVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalLeftVector;"
|
|
||||||
{ "&DiacriticalRightArrow;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightArrow;"
|
|
||||||
{ "&DiacriticalRightVector;" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &DiacriticalRightVector;"
|
|
||||||
{ "˜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "˜"
|
|
||||||
{ "⋄" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋄"
|
|
||||||
{ "ⅆ" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "ⅆ"
|
|
||||||
{ "≐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≐"
|
|
||||||
{ "∯" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ∯"
|
|
||||||
{ "¨" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "¨"
|
|
||||||
{ "⇓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇓"
|
|
||||||
{ "⇐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇐"
|
|
||||||
{ "⇔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⇔"
|
|
||||||
{ "⫤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫤"
|
|
||||||
{ "⟸" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟸"
|
|
||||||
{ "⟺" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟺"
|
|
||||||
{ "⟹" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⟹"
|
|
||||||
{ "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒"
|
|
||||||
{ "⊨" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊨"
|
|
||||||
{ "⇑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇑"
|
|
||||||
{ "⇕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇕"
|
|
||||||
{ "∥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∥"
|
|
||||||
{ "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↓"
|
|
||||||
{ "⤓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤓"
|
|
||||||
{ "⇵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇵"
|
|
||||||
{ "̑" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "̑"
|
|
||||||
{ "⥐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥐"
|
|
||||||
{ "⥞" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥞"
|
|
||||||
{ "↽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↽"
|
|
||||||
{ "⥖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥖"
|
|
||||||
{ "⥟" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥟"
|
|
||||||
{ "⇁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇁"
|
|
||||||
{ "⥗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥗"
|
|
||||||
{ "⊤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊤"
|
|
||||||
{ "↧" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↧"
|
|
||||||
{ "∈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∈"
|
|
||||||
{ "⩵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩵"
|
|
||||||
{ "≂" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂"
|
|
||||||
{ "⇌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇌"
|
|
||||||
{ "∃" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∃"
|
|
||||||
{ "∀" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∀"
|
|
||||||
{ "≥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≥"
|
|
||||||
{ "⋛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋛"
|
|
||||||
{ "≧" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧"
|
|
||||||
{ "⪢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪢"
|
|
||||||
{ "≷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≷"
|
|
||||||
{ "⩾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩾"
|
|
||||||
{ "≳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≳"
|
|
||||||
{ "ˇ" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::NoStretch }, // "ˇ"
|
|
||||||
{ "^" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "^"
|
|
||||||
{ "─" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "─"
|
|
||||||
{ "≎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎"
|
|
||||||
{ "≏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏"
|
|
||||||
{ "⇒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇒"
|
|
||||||
{ "∫" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∫"
|
|
||||||
{ "⋂" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋂"
|
|
||||||
{ "⁣" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // "⁣"
|
|
||||||
{ "⁢" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⁢"
|
|
||||||
{ "⟨" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟨"
|
|
||||||
{ "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "←"
|
|
||||||
{ "⇤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇤"
|
|
||||||
{ "⇆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇆"
|
|
||||||
{ "&LeftBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&LeftBracketingBar;"
|
|
||||||
{ "⌈" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌈"
|
|
||||||
{ "⟦" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟦"
|
|
||||||
{ "&LeftDoubleBracketingBar;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &LeftDoubleBracketingBar;"
|
|
||||||
{ "⥡" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥡"
|
|
||||||
{ "⇃" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇃"
|
|
||||||
{ "⥙" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥙"
|
|
||||||
{ "⌊" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌊"
|
|
||||||
{ "↔" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↔"
|
|
||||||
{ "⥎" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥎"
|
|
||||||
{ "&LeftSkeleton;" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&LeftSkeleton;"
|
|
||||||
{ "⊣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊣"
|
|
||||||
{ "↤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↤"
|
|
||||||
{ "⥚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥚"
|
|
||||||
{ "⊲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊲"
|
|
||||||
{ "⧏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏"
|
|
||||||
{ "⊴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊴"
|
|
||||||
{ "⥑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥑"
|
|
||||||
{ "⥠" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥠"
|
|
||||||
{ "↿" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↿"
|
|
||||||
{ "⥘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥘"
|
|
||||||
{ "↼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↼"
|
|
||||||
{ "⥒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥒"
|
|
||||||
{ "⋚" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋚"
|
|
||||||
{ "≦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≦"
|
|
||||||
{ "≶" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≶"
|
|
||||||
{ "⪡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡"
|
|
||||||
{ "⩽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽"
|
|
||||||
{ "≲" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≲"
|
|
||||||
{ "⟵" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟵"
|
|
||||||
{ "⟷" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟷"
|
|
||||||
{ "⟶" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⟶"
|
|
||||||
{ "↙" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↙"
|
|
||||||
{ "↘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↘"
|
|
||||||
{ "∓" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∓"
|
|
||||||
{ "≫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ≫"
|
|
||||||
{ "≪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪"
|
|
||||||
{ "⫬" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⫬"
|
|
||||||
{ "≢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≢"
|
|
||||||
{ "≭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≭"
|
|
||||||
{ "∦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ∦"
|
|
||||||
{ "∉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∉"
|
|
||||||
{ "≠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≠"
|
|
||||||
{ "≂̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≂̸"
|
|
||||||
{ "∄" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∄"
|
|
||||||
{ "≯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≯"
|
|
||||||
{ "≱" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≱"
|
|
||||||
{ "≧̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≧̸"
|
|
||||||
{ "≫̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≫̸"
|
|
||||||
{ "≹" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≹"
|
|
||||||
{ "⩾̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⩾̸"
|
|
||||||
{ "≵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≵"
|
|
||||||
{ "≎̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≎̸"
|
|
||||||
{ "≏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≏̸"
|
|
||||||
{ "⋪" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋪"
|
|
||||||
{ "⧏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧏̸"
|
|
||||||
{ "⋬" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋬"
|
|
||||||
{ "≮" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≮"
|
|
||||||
{ "≰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≰"
|
|
||||||
{ "&NotLessFullEqual;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotLessFullEqual;"
|
|
||||||
{ "≸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≸"
|
|
||||||
{ "≪̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≪̸"
|
|
||||||
{ "⩽̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⩽̸"
|
|
||||||
{ "≴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≴"
|
|
||||||
{ "⪢̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⪢̸"
|
|
||||||
{ "⪡̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪡̸"
|
|
||||||
{ "⊀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊀"
|
|
||||||
{ "⪯̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯̸"
|
|
||||||
{ "⋠" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋠"
|
|
||||||
{ "&NotPrecedesTilde;" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&NotPrecedesTilde;"
|
|
||||||
{ "∌" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∌"
|
|
||||||
{ "⋫" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋫"
|
|
||||||
{ "⧐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐̸"
|
|
||||||
{ "⋭" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋭"
|
|
||||||
{ "⊏̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏̸"
|
|
||||||
{ "⋢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋢"
|
|
||||||
{ "⊐̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐̸"
|
|
||||||
{ "⋣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋣"
|
|
||||||
{ "⊂⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊂⃒"
|
|
||||||
{ "⊈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊈"
|
|
||||||
{ "⊁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊁"
|
|
||||||
{ "⪰̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰̸"
|
|
||||||
{ "⋡" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ⋡"
|
|
||||||
{ "≿̸" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿̸"
|
|
||||||
{ "⊃⃒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃⃒"
|
|
||||||
{ "⊉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊉"
|
|
||||||
{ "≁" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≁"
|
|
||||||
{ "≄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≄"
|
|
||||||
{ "≇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≇"
|
|
||||||
{ "≉" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≉"
|
|
||||||
{ "∤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∤"
|
|
||||||
{ "“" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // “"
|
|
||||||
{ "‘" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "‘"
|
|
||||||
{ "⩔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⩔"
|
|
||||||
{ "‾" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "‾"
|
|
||||||
{ "⏞" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏞"
|
|
||||||
{ "⎴" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎴"
|
|
||||||
{ "⏜" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⏜"
|
|
||||||
{ "∂" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∂"
|
|
||||||
{ "±" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "±"
|
|
||||||
{ "≺" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≺"
|
|
||||||
{ "⪯" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪯"
|
|
||||||
{ "≼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≼"
|
|
||||||
{ "≾" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≾"
|
|
||||||
{ "∏" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∏"
|
|
||||||
{ "∷" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∷"
|
|
||||||
{ "∝" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∝"
|
|
||||||
{ "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋"
|
|
||||||
{ "⇋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇋"
|
|
||||||
{ "⥯" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // ⥯"
|
|
||||||
{ "⟩" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟩"
|
|
||||||
{ "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "→"
|
|
||||||
{ "⇥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇥"
|
|
||||||
{ "⇄" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇄"
|
|
||||||
{ "&RightBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "&RightBracketingBar;"
|
|
||||||
{ "⌉" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌉"
|
|
||||||
{ "⟧" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⟧"
|
|
||||||
{ "&RightDoubleBracketingBar;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // &RightDoubleBracketingBar;"
|
|
||||||
{ "⥝" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥝"
|
|
||||||
{ "⇂" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⇂"
|
|
||||||
{ "⥕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥕"
|
|
||||||
{ "⌋" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⌋"
|
|
||||||
{ "&RightSkeleton;" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&RightSkeleton;"
|
|
||||||
{ "⊢" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊢"
|
|
||||||
{ "↦" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "↦"
|
|
||||||
{ "⥛" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥛"
|
|
||||||
{ "⊳" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊳"
|
|
||||||
{ "⧐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⧐"
|
|
||||||
{ "⊵" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊵"
|
|
||||||
{ "⥏" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥏"
|
|
||||||
{ "⥜" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥜"
|
|
||||||
{ "↾" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↾"
|
|
||||||
{ "⥔" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⥔"
|
|
||||||
{ "⇀" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⇀"
|
|
||||||
{ "⥓" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⥓"
|
|
||||||
{ "⥰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⥰"
|
|
||||||
{ "↓" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "↓"
|
|
||||||
{ "←" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "←"
|
|
||||||
{ "→" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::HStretch }, // "→"
|
|
||||||
{ "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::VStretch }, // "↑"
|
|
||||||
{ "∘" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∘"
|
|
||||||
{ "√" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "√"
|
|
||||||
{ "□" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "□"
|
|
||||||
{ "⊓" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊓"
|
|
||||||
{ "⊏" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊏"
|
|
||||||
{ "⊑" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊑"
|
|
||||||
{ "⊐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊐"
|
|
||||||
{ "⊒" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊒"
|
|
||||||
{ "⊔" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊔"
|
|
||||||
{ "⋆" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋆"
|
|
||||||
{ "⋐" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋐"
|
|
||||||
{ "⊆" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊆"
|
|
||||||
{ "≻" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≻"
|
|
||||||
{ "⪰" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⪰"
|
|
||||||
{ "≽" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≽"
|
|
||||||
{ "≿" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≿"
|
|
||||||
{ "∋" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∋"
|
|
||||||
{ "∑" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∑"
|
|
||||||
{ "⊃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊃"
|
|
||||||
{ "⊇" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊇"
|
|
||||||
{ "∴" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∴"
|
|
||||||
{ "∼" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∼"
|
|
||||||
{ "≃" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≃"
|
|
||||||
{ "≅" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≅"
|
|
||||||
{ "≈" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≈"
|
|
||||||
{ "⃛" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⃛"
|
|
||||||
{ "_" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "_"
|
|
||||||
{ "⏟" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏟"
|
|
||||||
{ "⎵" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⎵"
|
|
||||||
{ "⏝" , QwtMml::PostfixForm, { "true", 0, 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::HStretch }, // "⏝"
|
|
||||||
{ "⋃" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⋃"
|
|
||||||
{ "⊎" , QwtMml::PrefixForm, { 0, 0, "true", "0em", 0, "true", "thinmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "⊎"
|
|
||||||
{ "↑" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↑"
|
|
||||||
{ "⤒" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⤒"
|
|
||||||
{ "⇅" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⇅"
|
|
||||||
{ "↕" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↕"
|
|
||||||
{ "⥮" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "⥮"
|
|
||||||
{ "⊥" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⊥"
|
|
||||||
{ "↥" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "↥"
|
|
||||||
{ "↖" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↖"
|
|
||||||
{ "↗" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::HVStretch }, // "↗"
|
|
||||||
{ "⋁" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋁"
|
|
||||||
{ "∣" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "∣"
|
|
||||||
{ "|" , QwtMml::InfixForm, { 0, 0, 0, "0em", "0", 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|"
|
|
||||||
{ "❘" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "❘"
|
|
||||||
{ "≀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≀"
|
|
||||||
{ "⋀" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "⋀"
|
|
||||||
{ "&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&"
|
|
||||||
{ "&&" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "&&"
|
|
||||||
{ "≤" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "≤"
|
|
||||||
{ "<" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<"
|
|
||||||
{ "<=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<="
|
|
||||||
{ "<>" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "<>"
|
|
||||||
{ "'" , QwtMml::PostfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "'"
|
|
||||||
{ "(" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "("
|
|
||||||
{ ")" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // ")"
|
|
||||||
{ "*" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*"
|
|
||||||
{ "**" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "**"
|
|
||||||
{ "*=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "*="
|
|
||||||
{ "+" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+"
|
|
||||||
{ "+" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+"
|
|
||||||
{ "++" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "++"
|
|
||||||
{ "+=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "+="
|
|
||||||
{ "," , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ","
|
|
||||||
{ "-" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-"
|
|
||||||
{ "-" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "veryverythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-"
|
|
||||||
{ "--" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "--"
|
|
||||||
{ "-=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "-="
|
|
||||||
{ "->" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "->"
|
|
||||||
{ "." , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "."
|
|
||||||
{ ".." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ".."
|
|
||||||
{ "..." , QwtMml::PostfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "0em", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "..."
|
|
||||||
{ "/" , QwtMml::InfixForm, { 0, 0, 0, "thinmathspace", 0, 0, "thinmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "/"
|
|
||||||
{ "//" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "//"
|
|
||||||
{ "/=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "/="
|
|
||||||
{ ":" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":"
|
|
||||||
{ ":=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ":="
|
|
||||||
{ ";" , QwtMml::InfixForm, { 0, 0, 0, "0em", 0, 0, "verythickmathspace", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";"
|
|
||||||
{ ";" , QwtMml::PostfixForm, { 0, 0, 0, "0em", 0, 0, "0em", "true", 0 }, QwtMmlOperSpec::NoStretch }, // ";"
|
|
||||||
{ "=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "="
|
|
||||||
{ "==" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "=="
|
|
||||||
{ ">" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">"
|
|
||||||
{ ">=" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // ">="
|
|
||||||
{ "?" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "?"
|
|
||||||
{ "@" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "@"
|
|
||||||
{ "[" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "["
|
|
||||||
{ "]" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "]"
|
|
||||||
{ "^" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "^"
|
|
||||||
{ "_" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "_"
|
|
||||||
{ "lim" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "lim"
|
|
||||||
{ "max" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "max"
|
|
||||||
{ "min" , QwtMml::PrefixForm, { 0, 0, 0, "0em", 0, "true", "thinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "min"
|
|
||||||
{ "{" , QwtMml::PrefixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "{"
|
|
||||||
{ "|" , QwtMml::InfixForm, { 0, 0, 0, "thickmathspace", 0, 0, "thickmathspace", 0, "true" }, QwtMmlOperSpec::VStretch }, // "|"
|
|
||||||
{ "||" , QwtMml::InfixForm, { 0, 0, 0, "mediummathspace", 0, 0, "mediummathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "||"
|
|
||||||
{ "}" , QwtMml::PostfixForm, { 0, "true", 0, "0em", 0, 0, "0em", 0, "true" }, QwtMmlOperSpec::VStretch }, // "}"
|
|
||||||
{ "~" , QwtMml::InfixForm, { 0, 0, 0, "verythinmathspace", 0, 0, "verythinmathspace", 0, 0 }, QwtMmlOperSpec::NoStretch }, // "~"
|
|
||||||
|
|
||||||
{ 0 , QwtMml::InfixForm, { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, QwtMmlOperSpec::NoStretch }
|
|
||||||
};
|
|
||||||
|
|
||||||
static const QwtMmlOperSpec g_oper_spec_defaults =
|
|
||||||
{ 0 , QwtMml::InfixForm, { "false", "false", "false", "thickmathspace", "1", "false", "thickmathspace", "false", "false" }, QwtMmlOperSpec::NoStretch };
|
|
||||||
|
|
||||||
static const uint g_oper_spec_count = sizeof( g_oper_spec_data ) / sizeof( QwtMmlOperSpec ) - 1;
|
|
||||||
|
|
||||||
static const QwtMmlEntitySpec g_xml_entity_data[] =
|
|
||||||
{
|
|
||||||
{ "angzarr", "⍼" },
|
|
||||||
{ "cirmid", "⫯" },
|
|
||||||
{ "cudarrl", "⤸" },
|
|
||||||
{ "cudarrr", "⤵" },
|
|
||||||
{ "cularr", "↶" },
|
|
||||||
{ "cularrp", "⤽" },
|
|
||||||
{ "curarr", "↷" },
|
|
||||||
{ "curarrm", "⤼" },
|
|
||||||
{ "Darr", "↡" },
|
|
||||||
{ "dArr", "⇓" },
|
|
||||||
{ "ddarr", "⇊" },
|
|
||||||
{ "DDotrahd", "⤑" },
|
|
||||||
{ "dfisht", "⥿" },
|
|
||||||
{ "dHar", "⥥" },
|
|
||||||
{ "dharl", "⇃" },
|
|
||||||
{ "dharr", "⇂" },
|
|
||||||
{ "duarr", "⇵" },
|
|
||||||
{ "duhar", "⥯" },
|
|
||||||
{ "dzigrarr", "⟿" },
|
|
||||||
{ "erarr", "⥱" },
|
|
||||||
{ "hArr", "⇔" },
|
|
||||||
{ "harr", "↔" },
|
|
||||||
{ "harrcir", "⥈" },
|
|
||||||
{ "harrw", "↭" },
|
|
||||||
{ "hoarr", "⇿" },
|
|
||||||
{ "imof", "⊷" },
|
|
||||||
{ "lAarr", "⇚" },
|
|
||||||
{ "Larr", "↞" },
|
|
||||||
{ "larrbfs", "⤟" },
|
|
||||||
{ "larrfs", "⤝" },
|
|
||||||
{ "larrhk", "↩" },
|
|
||||||
{ "larrlp", "↫" },
|
|
||||||
{ "larrpl", "⤹" },
|
|
||||||
{ "larrsim", "⥳" },
|
|
||||||
{ "larrtl", "↢" },
|
|
||||||
{ "lAtail", "⤛" },
|
|
||||||
{ "latail", "⤙" },
|
|
||||||
{ "lBarr", "⤎" },
|
|
||||||
{ "lbarr", "⤌" },
|
|
||||||
{ "ldca", "⤶" },
|
|
||||||
{ "ldrdhar", "⥧" },
|
|
||||||
{ "ldrushar", "⥋" },
|
|
||||||
{ "ldsh", "↲" },
|
|
||||||
{ "lfisht", "⥼" },
|
|
||||||
{ "lHar", "⥢" },
|
|
||||||
{ "lhard", "↽" },
|
|
||||||
{ "lharu", "↼" },
|
|
||||||
{ "lharul", "⥪" },
|
|
||||||
{ "llarr", "⇇" },
|
|
||||||
{ "llhard", "⥫" },
|
|
||||||
{ "loarr", "⇽" },
|
|
||||||
{ "lrarr", "⇆" },
|
|
||||||
{ "lrhar", "⇋" },
|
|
||||||
{ "lrhard", "⥭" },
|
|
||||||
{ "lsh", "↰" },
|
|
||||||
{ "lurdshar", "⥊" },
|
|
||||||
{ "luruhar", "⥦" },
|
|
||||||
{ "Map", "⤅" },
|
|
||||||
{ "map", "↦" },
|
|
||||||
{ "midcir", "⫰" },
|
|
||||||
{ "mumap", "⊸" },
|
|
||||||
{ "nearhk", "⤤" },
|
|
||||||
{ "neArr", "⇗" },
|
|
||||||
{ "nearr", "↗" },
|
|
||||||
{ "nesear", "⤨" },
|
|
||||||
{ "nhArr", "⇎" },
|
|
||||||
{ "nharr", "↮" },
|
|
||||||
{ "nlArr", "⇍" },
|
|
||||||
{ "nlarr", "↚" },
|
|
||||||
{ "nrArr", "⇏" },
|
|
||||||
{ "nrarr", "↛" },
|
|
||||||
{ "nrarrc", "⤳̸" },
|
|
||||||
{ "nrarrw", "↝̸" },
|
|
||||||
{ "nvHarr", "⤄" },
|
|
||||||
{ "nvlArr", "⤂" },
|
|
||||||
{ "nvrArr", "⤃" },
|
|
||||||
{ "nwarhk", "⤣" },
|
|
||||||
{ "nwArr", "⇖" },
|
|
||||||
{ "nwarr", "↖" },
|
|
||||||
{ "nwnear", "⤧" },
|
|
||||||
{ "olarr", "↺" },
|
|
||||||
{ "orarr", "↻" },
|
|
||||||
{ "origof", "⊶" },
|
|
||||||
{ "rAarr", "⇛" },
|
|
||||||
{ "Rarr", "↠" },
|
|
||||||
{ "rarrap", "⥵" },
|
|
||||||
{ "rarrbfs", "⤠" },
|
|
||||||
{ "rarrc", "⤳" },
|
|
||||||
{ "rarrfs", "⤞" },
|
|
||||||
{ "rarrhk", "↪" },
|
|
||||||
{ "rarrlp", "↬" },
|
|
||||||
{ "rarrpl", "⥅" },
|
|
||||||
{ "rarrsim", "⥴" },
|
|
||||||
{ "Rarrtl", "⤖" },
|
|
||||||
{ "rarrtl", "↣" },
|
|
||||||
{ "rarrw", "↝" },
|
|
||||||
{ "rAtail", "⤜" },
|
|
||||||
{ "ratail", "⤚" },
|
|
||||||
{ "RBarr", "⤐" },
|
|
||||||
{ "rBarr", "⤏" },
|
|
||||||
{ "rbarr", "⤍" },
|
|
||||||
{ "rdca", "⤷" },
|
|
||||||
{ "rdldhar", "⥩" },
|
|
||||||
{ "rdsh", "↳" },
|
|
||||||
{ "rfisht", "⥽" },
|
|
||||||
{ "rHar", "⥤" },
|
|
||||||
{ "rhard", "⇁" },
|
|
||||||
{ "rharu", "⇀" },
|
|
||||||
{ "rharul", "⥬" },
|
|
||||||
{ "rlarr", "⇄" },
|
|
||||||
{ "rlhar", "⇌" },
|
|
||||||
{ "roarr", "⇾" },
|
|
||||||
{ "rrarr", "⇉" },
|
|
||||||
{ "rsh", "↱" },
|
|
||||||
{ "ruluhar", "⥨" },
|
|
||||||
{ "searhk", "⤥" },
|
|
||||||
{ "seArr", "⇘" },
|
|
||||||
{ "searr", "↘" },
|
|
||||||
{ "seswar", "⤩" },
|
|
||||||
{ "simrarr", "⥲" },
|
|
||||||
{ "slarr", "←" },
|
|
||||||
{ "srarr", "→" },
|
|
||||||
{ "swarhk", "⤦" },
|
|
||||||
{ "swArr", "⇙" },
|
|
||||||
{ "swarr", "↙" },
|
|
||||||
{ "swnwar", "⤪" },
|
|
||||||
{ "Uarr", "↟" },
|
|
||||||
{ "uArr", "⇑" },
|
|
||||||
{ "Uarrocir", "⥉" },
|
|
||||||
{ "udarr", "⇅" },
|
|
||||||
{ "udhar", "⥮" },
|
|
||||||
{ "ufisht", "⥾" },
|
|
||||||
{ "uHar", "⥣" },
|
|
||||||
{ "uharl", "↿" },
|
|
||||||
{ "uharr", "↾" },
|
|
||||||
{ "uuarr", "⇈" },
|
|
||||||
{ "vArr", "⇕" },
|
|
||||||
{ "varr", "↕" },
|
|
||||||
{ "xhArr", "⟺" },
|
|
||||||
{ "xharr", "⟷" },
|
|
||||||
{ "xlArr", "⟸" },
|
|
||||||
{ "xlarr", "⟵" },
|
|
||||||
{ "xmap", "⟼" },
|
|
||||||
{ "xrArr", "⟹" },
|
|
||||||
{ "xrarr", "⟶" },
|
|
||||||
{ "zigrarr", "⇝" },
|
|
||||||
{ "ac", "∾" },
|
|
||||||
{ "acE", "∾̳" },
|
|
||||||
{ "amalg", "⨿" },
|
|
||||||
{ "barvee", "⊽" },
|
|
||||||
{ "Barwed", "⌆" },
|
|
||||||
{ "barwed", "⌅" },
|
|
||||||
{ "bsolb", "⧅" },
|
|
||||||
{ "Cap", "⋒" },
|
|
||||||
{ "capand", "⩄" },
|
|
||||||
{ "capbrcup", "⩉" },
|
|
||||||
{ "capcap", "⩋" },
|
|
||||||
{ "capcup", "⩇" },
|
|
||||||
{ "capdot", "⩀" },
|
|
||||||
{ "caps", "∩︀" },
|
|
||||||
{ "ccaps", "⩍" },
|
|
||||||
{ "ccups", "⩌" },
|
|
||||||
{ "ccupssm", "⩐" },
|
|
||||||
{ "coprod", "∐" },
|
|
||||||
{ "Cup", "⋓" },
|
|
||||||
{ "cupbrcap", "⩈" },
|
|
||||||
{ "cupcap", "⩆" },
|
|
||||||
{ "cupcup", "⩊" },
|
|
||||||
{ "cupdot", "⊍" },
|
|
||||||
{ "cupor", "⩅" },
|
|
||||||
{ "cups", "∪︀" },
|
|
||||||
{ "cuvee", "⋎" },
|
|
||||||
{ "cuwed", "⋏" },
|
|
||||||
{ "Dagger", "‡" },
|
|
||||||
{ "dagger", "†" },
|
|
||||||
{ "diam", "⋄" },
|
|
||||||
{ "divonx", "⋇" },
|
|
||||||
{ "eplus", "⩱" },
|
|
||||||
{ "hercon", "⊹" },
|
|
||||||
{ "intcal", "⊺" },
|
|
||||||
{ "iprod", "⨼" },
|
|
||||||
{ "loplus", "⨭" },
|
|
||||||
{ "lotimes", "⨴" },
|
|
||||||
{ "lthree", "⋋" },
|
|
||||||
{ "ltimes", "⋉" },
|
|
||||||
{ "midast", "*" },
|
|
||||||
{ "minusb", "⊟" },
|
|
||||||
{ "minusd", "∸" },
|
|
||||||
{ "minusdu", "⨪" },
|
|
||||||
{ "ncap", "⩃" },
|
|
||||||
{ "ncup", "⩂" },
|
|
||||||
{ "oast", "⊛" },
|
|
||||||
{ "ocir", "⊚" },
|
|
||||||
{ "odash", "⊝" },
|
|
||||||
{ "odiv", "⨸" },
|
|
||||||
{ "odot", "⊙" },
|
|
||||||
{ "odsold", "⦼" },
|
|
||||||
{ "ofcir", "⦿" },
|
|
||||||
{ "ogt", "⧁" },
|
|
||||||
{ "ohbar", "⦵" },
|
|
||||||
{ "olcir", "⦾" },
|
|
||||||
{ "olt", "⧀" },
|
|
||||||
{ "omid", "⦶" },
|
|
||||||
{ "ominus", "⊖" },
|
|
||||||
{ "opar", "⦷" },
|
|
||||||
{ "operp", "⦹" },
|
|
||||||
{ "oplus", "⊕" },
|
|
||||||
{ "osol", "⊘" },
|
|
||||||
{ "Otimes", "⨷" },
|
|
||||||
{ "otimes", "⊗" },
|
|
||||||
{ "otimesas", "⨶" },
|
|
||||||
{ "ovbar", "⌽" },
|
|
||||||
{ "plusacir", "⨣" },
|
|
||||||
{ "plusb", "⊞" },
|
|
||||||
{ "pluscir", "⨢" },
|
|
||||||
{ "plusdo", "∔" },
|
|
||||||
{ "plusdu", "⨥" },
|
|
||||||
{ "pluse", "⩲" },
|
|
||||||
{ "plussim", "⨦" },
|
|
||||||
{ "plustwo", "⨧" },
|
|
||||||
{ "prod", "∏" },
|
|
||||||
{ "race", "⧚" },
|
|
||||||
{ "roplus", "⨮" },
|
|
||||||
{ "rotimes", "⨵" },
|
|
||||||
{ "rthree", "⋌" },
|
|
||||||
{ "rtimes", "⋊" },
|
|
||||||
{ "sdot", "⋅" },
|
|
||||||
{ "sdotb", "⊡" },
|
|
||||||
{ "setmn", "∖" },
|
|
||||||
{ "simplus", "⨤" },
|
|
||||||
{ "smashp", "⨳" },
|
|
||||||
{ "solb", "⧄" },
|
|
||||||
{ "sqcap", "⊓" },
|
|
||||||
{ "sqcaps", "⊓︀" },
|
|
||||||
{ "sqcup", "⊔" },
|
|
||||||
{ "sqcups", "⊔︀" },
|
|
||||||
{ "ssetmn", "∖" },
|
|
||||||
{ "sstarf", "⋆" },
|
|
||||||
{ "subdot", "⪽" },
|
|
||||||
{ "sum", "∑" },
|
|
||||||
{ "supdot", "⪾" },
|
|
||||||
{ "timesb", "⊠" },
|
|
||||||
{ "timesbar", "⨱" },
|
|
||||||
{ "timesd", "⨰" },
|
|
||||||
{ "tridot", "◬" },
|
|
||||||
{ "triminus", "⨺" },
|
|
||||||
{ "triplus", "⨹" },
|
|
||||||
{ "trisb", "⧍" },
|
|
||||||
{ "tritime", "⨻" },
|
|
||||||
{ "uplus", "⊎" },
|
|
||||||
{ "veebar", "⊻" },
|
|
||||||
{ "wedbar", "⩟" },
|
|
||||||
{ "wreath", "≀" },
|
|
||||||
{ "xcap", "⋂" },
|
|
||||||
{ "xcirc", "◯" },
|
|
||||||
{ "xcup", "⋃" },
|
|
||||||
{ "xdtri", "▽" },
|
|
||||||
{ "xodot", "⨀" },
|
|
||||||
{ "xoplus", "⨁" },
|
|
||||||
{ "xotime", "⨂" },
|
|
||||||
{ "xsqcup", "⨆" },
|
|
||||||
{ "xuplus", "⨄" },
|
|
||||||
{ "xutri", "△" },
|
|
||||||
{ "xvee", "⋁" },
|
|
||||||
{ "xwedge", "⋀" },
|
|
||||||
{ "dlcorn", "⌞" },
|
|
||||||
{ "drcorn", "⌟" },
|
|
||||||
{ "gtlPar", "⦕" },
|
|
||||||
{ "langd", "⦑" },
|
|
||||||
{ "lbrke", "⦋" },
|
|
||||||
{ "lbrksld", "⦏" },
|
|
||||||
{ "lbrkslu", "⦍" },
|
|
||||||
{ "lceil", "⌈" },
|
|
||||||
{ "lfloor", "⌊" },
|
|
||||||
{ "lmoust", "⎰" },
|
|
||||||
{ "lparlt", "⦓" },
|
|
||||||
{ "ltrPar", "⦖" },
|
|
||||||
{ "rangd", "⦒" },
|
|
||||||
{ "rbrke", "⦌" },
|
|
||||||
{ "rbrksld", "⦎" },
|
|
||||||
{ "rbrkslu", "⦐" },
|
|
||||||
{ "rceil", "⌉" },
|
|
||||||
{ "rfloor", "⌋" },
|
|
||||||
{ "rmoust", "⎱" },
|
|
||||||
{ "rpargt", "⦔" },
|
|
||||||
{ "ulcorn", "⌜" },
|
|
||||||
{ "urcorn", "⌝" },
|
|
||||||
{ "gnap", "⪊" },
|
|
||||||
{ "gnE", "≩" },
|
|
||||||
{ "gne", "⪈" },
|
|
||||||
{ "gnsim", "⋧" },
|
|
||||||
{ "gvnE", "≩︀" },
|
|
||||||
{ "lnap", "⪉" },
|
|
||||||
{ "lnE", "≨" },
|
|
||||||
{ "lne", "⪇" },
|
|
||||||
{ "lnsim", "⋦" },
|
|
||||||
{ "lvnE", "≨︀" },
|
|
||||||
{ "nap", "≉" },
|
|
||||||
{ "napE", "⩰̸" },
|
|
||||||
{ "napid", "≋̸" },
|
|
||||||
{ "ncong", "≇" },
|
|
||||||
{ "ncongdot", "⩭̸" },
|
|
||||||
{ "nequiv", "≢" },
|
|
||||||
{ "ngE", "≧̸" },
|
|
||||||
{ "nge", "≱" },
|
|
||||||
{ "nges", "⩾̸" },
|
|
||||||
{ "nGg", "⋙̸" },
|
|
||||||
{ "ngsim", "≵" },
|
|
||||||
{ "nGt", "≫⃒" },
|
|
||||||
{ "ngt", "≯" },
|
|
||||||
{ "nGtv", "≫̸" },
|
|
||||||
{ "nlE", "≦̸" },
|
|
||||||
{ "nle", "≰" },
|
|
||||||
{ "nles", "⩽̸" },
|
|
||||||
{ "nLl", "⋘̸" },
|
|
||||||
{ "nlsim", "≴" },
|
|
||||||
{ "nLt", "≪⃒" },
|
|
||||||
{ "nlt", "≮" },
|
|
||||||
{ "nltri", "⋪" },
|
|
||||||
{ "nltrie", "⋬" },
|
|
||||||
{ "nLtv", "≪̸" },
|
|
||||||
{ "nmid", "∤" },
|
|
||||||
{ "npar", "∦" },
|
|
||||||
{ "npr", "⊀" },
|
|
||||||
{ "nprcue", "⋠" },
|
|
||||||
{ "npre", "⪯̸" },
|
|
||||||
{ "nrtri", "⋫" },
|
|
||||||
{ "nrtrie", "⋭" },
|
|
||||||
{ "nsc", "⊁" },
|
|
||||||
{ "nsccue", "⋡" },
|
|
||||||
{ "nsce", "⪰̸" },
|
|
||||||
{ "nsim", "≁" },
|
|
||||||
{ "nsime", "≄" },
|
|
||||||
{ "nsmid", "∤" },
|
|
||||||
{ "nspar", "∦" },
|
|
||||||
{ "nsqsube", "⋢" },
|
|
||||||
{ "nsqsupe", "⋣" },
|
|
||||||
{ "nsub", "⊄" },
|
|
||||||
{ "nsubE", "⫅̸" },
|
|
||||||
{ "nsube", "⊈" },
|
|
||||||
{ "nsup", "⊅" },
|
|
||||||
{ "nsupE", "⫆̸" },
|
|
||||||
{ "nsupe", "⊉" },
|
|
||||||
{ "ntgl", "≹" },
|
|
||||||
{ "ntlg", "≸" },
|
|
||||||
{ "nvap", "≍⃒" },
|
|
||||||
{ "nVDash", "⊯" },
|
|
||||||
{ "nVdash", "⊮" },
|
|
||||||
{ "nvDash", "⊭" },
|
|
||||||
{ "nvdash", "⊬" },
|
|
||||||
{ "nvge", "≥⃒" },
|
|
||||||
{ "nvgt", ">⃒" },
|
|
||||||
{ "nvle", "≤⃒" },
|
|
||||||
{ "nvlt", "<⃒" },
|
|
||||||
{ "nvltrie", "⊴⃒" },
|
|
||||||
{ "nvrtrie", "⊵⃒" },
|
|
||||||
{ "nvsim", "∼⃒" },
|
|
||||||
{ "parsim", "⫳" },
|
|
||||||
{ "prnap", "⪹" },
|
|
||||||
{ "prnE", "⪵" },
|
|
||||||
{ "prnsim", "⋨" },
|
|
||||||
{ "rnmid", "⫮" },
|
|
||||||
{ "scnap", "⪺" },
|
|
||||||
{ "scnE", "⪶" },
|
|
||||||
{ "scnsim", "⋩" },
|
|
||||||
{ "simne", "≆" },
|
|
||||||
{ "solbar", "⌿" },
|
|
||||||
{ "subnE", "⫋" },
|
|
||||||
{ "subne", "⊊" },
|
|
||||||
{ "supnE", "⫌" },
|
|
||||||
{ "supne", "⊋" },
|
|
||||||
{ "vnsub", "⊂⃒" },
|
|
||||||
{ "vnsup", "⊃⃒" },
|
|
||||||
{ "vsubnE", "⫋︀" },
|
|
||||||
{ "vsubne", "⊊︀" },
|
|
||||||
{ "vsupnE", "⫌︀" },
|
|
||||||
{ "vsupne", "⊋︀" },
|
|
||||||
{ "ang", "∠" },
|
|
||||||
{ "ange", "⦤" },
|
|
||||||
{ "angmsd", "∡" },
|
|
||||||
{ "angmsdaa", "⦨" },
|
|
||||||
{ "angmsdab", "⦩" },
|
|
||||||
{ "angmsdac", "⦪" },
|
|
||||||
{ "angmsdad", "⦫" },
|
|
||||||
{ "angmsdae", "⦬" },
|
|
||||||
{ "angmsdaf", "⦭" },
|
|
||||||
{ "angmsdag", "⦮" },
|
|
||||||
{ "angmsdah", "⦯" },
|
|
||||||
{ "angrtvb", "⊾" },
|
|
||||||
{ "angrtvbd", "⦝" },
|
|
||||||
{ "bbrk", "⎵" },
|
|
||||||
{ "bemptyv", "⦰" },
|
|
||||||
{ "beth", "ℶ" },
|
|
||||||
{ "boxbox", "⧉" },
|
|
||||||
{ "bprime", "‵" },
|
|
||||||
{ "bsemi", "⁏" },
|
|
||||||
{ "cemptyv", "⦲" },
|
|
||||||
{ "cirE", "⧃" },
|
|
||||||
{ "cirscir", "⧂" },
|
|
||||||
{ "comp", "∁" },
|
|
||||||
{ "daleth", "ℸ" },
|
|
||||||
{ "demptyv", "⦱" },
|
|
||||||
{ "ell", "ℓ" },
|
|
||||||
{ "empty", "∅" },
|
|
||||||
{ "emptyv", "∅" },
|
|
||||||
{ "gimel", "ℷ" },
|
|
||||||
{ "iiota", "℩" },
|
|
||||||
{ "image", "ℑ" },
|
|
||||||
{ "imath", "ı" },
|
|
||||||
{ "jmath", "j" },
|
|
||||||
{ "laemptyv", "⦴" },
|
|
||||||
{ "lltri", "◺" },
|
|
||||||
{ "lrtri", "⊿" },
|
|
||||||
{ "mho", "℧" },
|
|
||||||
{ "nang", "∠⃒" },
|
|
||||||
{ "nexist", "∄" },
|
|
||||||
{ "oS", "Ⓢ" },
|
|
||||||
{ "planck", "ℏ" },
|
|
||||||
{ "plankv", "ℏ" },
|
|
||||||
{ "raemptyv", "⦳" },
|
|
||||||
{ "range", "⦥" },
|
|
||||||
{ "real", "ℜ" },
|
|
||||||
{ "tbrk", "⎴" },
|
|
||||||
{ "ultri", "◸" },
|
|
||||||
{ "urtri", "◹" },
|
|
||||||
{ "vzigzag", "⦚" },
|
|
||||||
{ "weierp", "℘" },
|
|
||||||
{ "apE", "⩰" },
|
|
||||||
{ "ape", "≊" },
|
|
||||||
{ "apid", "≋" },
|
|
||||||
{ "asymp", "≈" },
|
|
||||||
{ "Barv", "⫧" },
|
|
||||||
{ "bcong", "≌" },
|
|
||||||
{ "bepsi", "϶" },
|
|
||||||
{ "bowtie", "⋈" },
|
|
||||||
{ "bsim", "∽" },
|
|
||||||
{ "bsime", "⋍" },
|
|
||||||
{ "bsolhsub", "\⊂" },
|
|
||||||
{ "bump", "≎" },
|
|
||||||
{ "bumpE", "⪮" },
|
|
||||||
{ "bumpe", "≏" },
|
|
||||||
{ "cire", "≗" },
|
|
||||||
{ "Colon", "∷" },
|
|
||||||
{ "Colone", "⩴" },
|
|
||||||
{ "colone", "≔" },
|
|
||||||
{ "congdot", "⩭" },
|
|
||||||
{ "csub", "⫏" },
|
|
||||||
{ "csube", "⫑" },
|
|
||||||
{ "csup", "⫐" },
|
|
||||||
{ "csupe", "⫒" },
|
|
||||||
{ "cuepr", "⋞" },
|
|
||||||
{ "cuesc", "⋟" },
|
|
||||||
{ "Dashv", "⫤" },
|
|
||||||
{ "dashv", "⊣" },
|
|
||||||
{ "easter", "⩮" },
|
|
||||||
{ "ecir", "≖" },
|
|
||||||
{ "ecolon", "≕" },
|
|
||||||
{ "eDDot", "⩷" },
|
|
||||||
{ "eDot", "≑" },
|
|
||||||
{ "efDot", "≒" },
|
|
||||||
{ "eg", "⪚" },
|
|
||||||
{ "egs", "⪖" },
|
|
||||||
{ "egsdot", "⪘" },
|
|
||||||
{ "el", "⪙" },
|
|
||||||
{ "els", "⪕" },
|
|
||||||
{ "elsdot", "⪗" },
|
|
||||||
{ "equest", "≟" },
|
|
||||||
{ "equivDD", "⩸" },
|
|
||||||
{ "erDot", "≓" },
|
|
||||||
{ "esdot", "≐" },
|
|
||||||
{ "Esim", "⩳" },
|
|
||||||
{ "esim", "≂" },
|
|
||||||
{ "fork", "⋔" },
|
|
||||||
{ "forkv", "⫙" },
|
|
||||||
{ "frown", "⌢" },
|
|
||||||
{ "gap", "⪆" },
|
|
||||||
{ "gE", "≧" },
|
|
||||||
{ "gEl", "⪌" },
|
|
||||||
{ "gel", "⋛" },
|
|
||||||
{ "ges", "⩾" },
|
|
||||||
{ "gescc", "⪩" },
|
|
||||||
{ "gesdot", "⪀" },
|
|
||||||
{ "gesdoto", "⪂" },
|
|
||||||
{ "gesdotol", "⪄" },
|
|
||||||
{ "gesl", "⋛︀" },
|
|
||||||
{ "gesles", "⪔" },
|
|
||||||
{ "Gg", "⋙" },
|
|
||||||
{ "gl", "≷" },
|
|
||||||
{ "gla", "⪥" },
|
|
||||||
{ "glE", "⪒" },
|
|
||||||
{ "glj", "⪤" },
|
|
||||||
{ "gsim", "≳" },
|
|
||||||
{ "gsime", "⪎" },
|
|
||||||
{ "gsiml", "⪐" },
|
|
||||||
{ "Gt", "≫" },
|
|
||||||
{ "gtcc", "⪧" },
|
|
||||||
{ "gtcir", "⩺" },
|
|
||||||
{ "gtdot", "⋗" },
|
|
||||||
{ "gtquest", "⩼" },
|
|
||||||
{ "gtrarr", "⥸" },
|
|
||||||
{ "homtht", "∻" },
|
|
||||||
{ "lap", "⪅" },
|
|
||||||
{ "lat", "⪫" },
|
|
||||||
{ "late", "⪭" },
|
|
||||||
{ "lates", "⪭︀" },
|
|
||||||
{ "lE", "≦" },
|
|
||||||
{ "lEg", "⪋" },
|
|
||||||
{ "leg", "⋚" },
|
|
||||||
{ "les", "⩽" },
|
|
||||||
{ "lescc", "⪨" },
|
|
||||||
{ "lesdot", "⩿" },
|
|
||||||
{ "lesdoto", "⪁" },
|
|
||||||
{ "lesdotor", "⪃" },
|
|
||||||
{ "lesg", "⋚︀" },
|
|
||||||
{ "lesges", "⪓" },
|
|
||||||
{ "lg", "≶" },
|
|
||||||
{ "lgE", "⪑" },
|
|
||||||
{ "Ll", "⋘" },
|
|
||||||
{ "lsim", "≲" },
|
|
||||||
{ "lsime", "⪍" },
|
|
||||||
{ "lsimg", "⪏" },
|
|
||||||
{ "Lt", "≪" },
|
|
||||||
{ "ltcc", "⪦" },
|
|
||||||
{ "ltcir", "⩹" },
|
|
||||||
{ "ltdot", "⋖" },
|
|
||||||
{ "ltlarr", "⥶" },
|
|
||||||
{ "ltquest", "⩻" },
|
|
||||||
{ "ltrie", "⊴" },
|
|
||||||
{ "mcomma", "⨩" },
|
|
||||||
{ "mDDot", "∺" },
|
|
||||||
{ "mid", "∣" },
|
|
||||||
{ "mlcp", "⫛" },
|
|
||||||
{ "models", "⊧" },
|
|
||||||
{ "mstpos", "∾" },
|
|
||||||
{ "Pr", "⪻" },
|
|
||||||
{ "pr", "≺" },
|
|
||||||
{ "prap", "⪷" },
|
|
||||||
{ "prcue", "≼" },
|
|
||||||
{ "prE", "⪳" },
|
|
||||||
{ "pre", "⪯" },
|
|
||||||
{ "prsim", "≾" },
|
|
||||||
{ "prurel", "⊰" },
|
|
||||||
{ "ratio", "∶" },
|
|
||||||
{ "rtrie", "⊵" },
|
|
||||||
{ "rtriltri", "⧎" },
|
|
||||||
{ "Sc", "⪼" },
|
|
||||||
{ "sc", "≻" },
|
|
||||||
{ "scap", "⪸" },
|
|
||||||
{ "sccue", "≽" },
|
|
||||||
{ "scE", "⪴" },
|
|
||||||
{ "sce", "⪰" },
|
|
||||||
{ "scsim", "≿" },
|
|
||||||
{ "sdote", "⩦" },
|
|
||||||
{ "simg", "⪞" },
|
|
||||||
{ "simgE", "⪠" },
|
|
||||||
{ "siml", "⪝" },
|
|
||||||
{ "simlE", "⪟" },
|
|
||||||
{ "smid", "∣" },
|
|
||||||
{ "smile", "⌣" },
|
|
||||||
{ "smt", "⪪" },
|
|
||||||
{ "smte", "⪬" },
|
|
||||||
{ "smtes", "⪬︀" },
|
|
||||||
{ "spar", "∥" },
|
|
||||||
{ "sqsub", "⊏" },
|
|
||||||
{ "sqsube", "⊑" },
|
|
||||||
{ "sqsup", "⊐" },
|
|
||||||
{ "sqsupe", "⊒" },
|
|
||||||
{ "Sub", "⋐" },
|
|
||||||
{ "subE", "⫅" },
|
|
||||||
{ "subedot", "⫃" },
|
|
||||||
{ "submult", "⫁" },
|
|
||||||
{ "subplus", "⪿" },
|
|
||||||
{ "subrarr", "⥹" },
|
|
||||||
{ "subsim", "⫇" },
|
|
||||||
{ "subsub", "⫕" },
|
|
||||||
{ "subsup", "⫓" },
|
|
||||||
{ "Sup", "⋑" },
|
|
||||||
{ "supdsub", "⫘" },
|
|
||||||
{ "supE", "⫆" },
|
|
||||||
{ "supedot", "⫄" },
|
|
||||||
{ "suphsol", "⊅" },
|
|
||||||
{ "suphsub", "⫗" },
|
|
||||||
{ "suplarr", "⥻" },
|
|
||||||
{ "supmult", "⫂" },
|
|
||||||
{ "supplus", "⫀" },
|
|
||||||
{ "supsim", "⫈" },
|
|
||||||
{ "supsub", "⫔" },
|
|
||||||
{ "supsup", "⫖" },
|
|
||||||
{ "thkap", "≈" },
|
|
||||||
{ "topfork", "⫚" },
|
|
||||||
{ "trie", "≜" },
|
|
||||||
{ "twixt", "≬" },
|
|
||||||
{ "Vbar", "⫫" },
|
|
||||||
{ "vBar", "⫨" },
|
|
||||||
{ "vBarv", "⫩" },
|
|
||||||
{ "VDash", "⊫" },
|
|
||||||
{ "Vdash", "⊩" },
|
|
||||||
{ "vDash", "⊨" },
|
|
||||||
{ "vdash", "⊢" },
|
|
||||||
{ "Vdashl", "⫦" },
|
|
||||||
{ "vltri", "⊲" },
|
|
||||||
{ "vprop", "∝" },
|
|
||||||
{ "vrtri", "⊳" },
|
|
||||||
{ "Vvdash", "⊪" },
|
|
||||||
{ "alpha", "α" },
|
|
||||||
{ "beta", "β" },
|
|
||||||
{ "chi", "χ" },
|
|
||||||
{ "Delta", "Δ" },
|
|
||||||
{ "delta", "δ" },
|
|
||||||
{ "epsi", "ε" },
|
|
||||||
{ "epsiv", "ɛ" },
|
|
||||||
{ "eta", "η" },
|
|
||||||
{ "Gamma", "Γ" },
|
|
||||||
{ "gamma", "γ" },
|
|
||||||
{ "Gammad", "Ϝ" },
|
|
||||||
{ "gammad", "ϝ" },
|
|
||||||
{ "iota", "ι" },
|
|
||||||
{ "kappa", "κ" },
|
|
||||||
{ "kappav", "ϰ" },
|
|
||||||
{ "Lambda", "Λ" },
|
|
||||||
{ "lambda", "λ" },
|
|
||||||
{ "mu", "μ" },
|
|
||||||
{ "nu", "ν" },
|
|
||||||
{ "Omega", "Ω" },
|
|
||||||
{ "omega", "ω" },
|
|
||||||
{ "Phi", "Φ" },
|
|
||||||
{ "phi", "ϕ" },
|
|
||||||
{ "phiv", "φ" },
|
|
||||||
{ "Pi", "Π" },
|
|
||||||
{ "pi", "π" },
|
|
||||||
{ "piv", "ϖ" },
|
|
||||||
{ "Psi", "Ψ" },
|
|
||||||
{ "psi", "ψ" },
|
|
||||||
{ "rho", "ρ" },
|
|
||||||
{ "rhov", "ϱ" },
|
|
||||||
{ "Sigma", "Σ" },
|
|
||||||
{ "sigma", "σ" },
|
|
||||||
{ "sigmav", "ς" },
|
|
||||||
{ "tau", "τ" },
|
|
||||||
{ "Theta", "Θ" },
|
|
||||||
{ "theta", "θ" },
|
|
||||||
{ "thetav", "ϑ" },
|
|
||||||
{ "Upsi", "ϒ" },
|
|
||||||
{ "upsi", "υ" },
|
|
||||||
{ "Xi", "Ξ" },
|
|
||||||
{ "xi", "ξ" },
|
|
||||||
{ "zeta", "ζ" },
|
|
||||||
{ "Cfr", "ℭ" },
|
|
||||||
{ "Hfr", "ℌ" },
|
|
||||||
{ "Ifr", "ℑ" },
|
|
||||||
{ "Rfr", "ℜ" },
|
|
||||||
{ "Zfr", "ℨ" },
|
|
||||||
{ "Copf", "ℂ" },
|
|
||||||
{ "Hopf", "ℍ" },
|
|
||||||
{ "Nopf", "ℕ" },
|
|
||||||
{ "Popf", "ℙ" },
|
|
||||||
{ "Qopf", "ℚ" },
|
|
||||||
{ "Ropf", "ℝ" },
|
|
||||||
{ "Zopf", "ℤ" },
|
|
||||||
{ "Bscr", "ℬ" },
|
|
||||||
{ "Escr", "ℰ" },
|
|
||||||
{ "escr", "ℯ" },
|
|
||||||
{ "Fscr", "ℱ" },
|
|
||||||
{ "gscr", "ℊ" },
|
|
||||||
{ "Hscr", "ℋ" },
|
|
||||||
{ "Iscr", "ℐ" },
|
|
||||||
{ "Lscr", "ℒ" },
|
|
||||||
{ "Mscr", "ℳ" },
|
|
||||||
{ "oscr", "ℴ" },
|
|
||||||
{ "pscr", "𝓅" },
|
|
||||||
{ "Rscr", "ℛ" },
|
|
||||||
{ "acd", "∿" },
|
|
||||||
{ "aleph", "ℵ" },
|
|
||||||
{ "And", "⩓" },
|
|
||||||
{ "and", "∧" },
|
|
||||||
{ "andand", "⩕" },
|
|
||||||
{ "andd", "⩜" },
|
|
||||||
{ "andslope", "⩘" },
|
|
||||||
{ "andv", "⩚" },
|
|
||||||
{ "angrt", "∟" },
|
|
||||||
{ "angsph", "∢" },
|
|
||||||
{ "angst", "Å" },
|
|
||||||
{ "ap", "≈" },
|
|
||||||
{ "apacir", "⩯" },
|
|
||||||
{ "awconint", "∳" },
|
|
||||||
{ "awint", "⨑" },
|
|
||||||
{ "becaus", "∵" },
|
|
||||||
{ "bernou", "ℬ" },
|
|
||||||
{ "bne", "=⃥" },
|
|
||||||
{ "bnequiv", "≡⃥" },
|
|
||||||
{ "bNot", "⫭" },
|
|
||||||
{ "bnot", "⌐" },
|
|
||||||
{ "bottom", "⊥" },
|
|
||||||
{ "cap", "∩" },
|
|
||||||
{ "Cconint", "∰" },
|
|
||||||
{ "cirfnint", "⨐" },
|
|
||||||
{ "compfn", "∘" },
|
|
||||||
{ "cong", "≅" },
|
|
||||||
{ "Conint", "∯" },
|
|
||||||
{ "conint", "∮" },
|
|
||||||
{ "ctdot", "⋯" },
|
|
||||||
{ "cup", "∪" },
|
|
||||||
{ "cwconint", "∲" },
|
|
||||||
{ "cwint", "∱" },
|
|
||||||
{ "cylcty", "⌭" },
|
|
||||||
{ "disin", "⋲" },
|
|
||||||
{ "Dot", "¨" },
|
|
||||||
{ "DotDot", "⃜" },
|
|
||||||
{ "dsol", "⧶" },
|
|
||||||
{ "dtdot", "⋱" },
|
|
||||||
{ "dwangle", "⦦" },
|
|
||||||
{ "epar", "⋕" },
|
|
||||||
{ "eparsl", "⧣" },
|
|
||||||
{ "equiv", "≡" },
|
|
||||||
{ "eqvparsl", "⧥" },
|
|
||||||
{ "exist", "∃" },
|
|
||||||
{ "fnof", "ƒ" },
|
|
||||||
{ "forall", "∀" },
|
|
||||||
{ "fpartint", "⨍" },
|
|
||||||
{ "ge", "≥" },
|
|
||||||
{ "hamilt", "ℋ" },
|
|
||||||
{ "iff", "⇔" },
|
|
||||||
{ "iinfin", "⧜" },
|
|
||||||
{ "infin", "∞" },
|
|
||||||
{ "Int", "∬" },
|
|
||||||
{ "int", "∫" },
|
|
||||||
{ "intlarhk", "⨗" },
|
|
||||||
{ "isin", "∈" },
|
|
||||||
{ "isindot", "⋵" },
|
|
||||||
{ "isinE", "⋹" },
|
|
||||||
{ "isins", "⋴" },
|
|
||||||
{ "isinsv", "⋳" },
|
|
||||||
{ "isinv", "∈" },
|
|
||||||
{ "lagran", "ℒ" },
|
|
||||||
{ "Lang", "《" },
|
|
||||||
{ "lang", "〈" },
|
|
||||||
{ "lArr", "⇐" },
|
|
||||||
{ "lbbrk", "〔" },
|
|
||||||
{ "le", "≤" },
|
|
||||||
{ "loang", "〘" },
|
|
||||||
{ "lobrk", "〚" },
|
|
||||||
{ "lopar", "⦅" },
|
|
||||||
{ "lowast", "∗" },
|
|
||||||
{ "minus", "−" },
|
|
||||||
{ "mnplus", "∓" },
|
|
||||||
{ "nabla", "∇" },
|
|
||||||
{ "ne", "≠" },
|
|
||||||
{ "nedot", "≐̸" },
|
|
||||||
{ "nhpar", "⫲" },
|
|
||||||
{ "ni", "∋" },
|
|
||||||
{ "nis", "⋼" },
|
|
||||||
{ "nisd", "⋺" },
|
|
||||||
{ "niv", "∋" },
|
|
||||||
{ "Not", "⫬" },
|
|
||||||
{ "notin", "∉" },
|
|
||||||
{ "notindot", "⋵̸" },
|
|
||||||
{ "notinva", "∉" },
|
|
||||||
{ "notinvb", "⋷" },
|
|
||||||
{ "notinvc", "⋶" },
|
|
||||||
{ "notni", "∌" },
|
|
||||||
{ "notniva", "∌" },
|
|
||||||
{ "notnivb", "⋾" },
|
|
||||||
{ "notnivc", "⋽" },
|
|
||||||
{ "nparsl", "⫽⃥" },
|
|
||||||
{ "npart", "∂̸" },
|
|
||||||
{ "npolint", "⨔" },
|
|
||||||
{ "nvinfin", "⧞" },
|
|
||||||
{ "olcross", "⦻" },
|
|
||||||
{ "Or", "⩔" },
|
|
||||||
{ "or", "∨" },
|
|
||||||
{ "ord", "⩝" },
|
|
||||||
{ "order", "ℴ" },
|
|
||||||
{ "oror", "⩖" },
|
|
||||||
{ "orslope", "⩗" },
|
|
||||||
{ "orv", "⩛" },
|
|
||||||
{ "par", "∥" },
|
|
||||||
{ "parsl", "⫽" },
|
|
||||||
{ "part", "∂" },
|
|
||||||
{ "permil", "‰" },
|
|
||||||
{ "perp", "⊥" },
|
|
||||||
{ "pertenk", "‱" },
|
|
||||||
{ "phmmat", "ℳ" },
|
|
||||||
{ "pointint", "⨕" },
|
|
||||||
{ "Prime", "″" },
|
|
||||||
{ "prime", "′" },
|
|
||||||
{ "profalar", "⌮" },
|
|
||||||
{ "profline", "⌒" },
|
|
||||||
{ "profsurf", "⌓" },
|
|
||||||
{ "prop", "∝" },
|
|
||||||
{ "qint", "⨌" },
|
|
||||||
{ "qprime", "⁗" },
|
|
||||||
{ "quatint", "⨖" },
|
|
||||||
{ "radic", "√" },
|
|
||||||
{ "Rang", "》" },
|
|
||||||
{ "rang", "〉" },
|
|
||||||
{ "rArr", "⇒" },
|
|
||||||
{ "rbbrk", "〕" },
|
|
||||||
{ "roang", "〙" },
|
|
||||||
{ "robrk", "〛" },
|
|
||||||
{ "ropar", "⦆" },
|
|
||||||
{ "rppolint", "⨒" },
|
|
||||||
{ "scpolint", "⨓" },
|
|
||||||
{ "sim", "∼" },
|
|
||||||
{ "simdot", "⩪" },
|
|
||||||
{ "sime", "≃" },
|
|
||||||
{ "smeparsl", "⧤" },
|
|
||||||
{ "square", "□" },
|
|
||||||
{ "squarf", "▪" },
|
|
||||||
{ "sub", "⊂" },
|
|
||||||
{ "sube", "⊆" },
|
|
||||||
{ "sup", "⊃" },
|
|
||||||
{ "supe", "⊇" },
|
|
||||||
{ "tdot", "⃛" },
|
|
||||||
{ "there4", "∴" },
|
|
||||||
{ "tint", "∭" },
|
|
||||||
{ "top", "⊤" },
|
|
||||||
{ "topbot", "⌶" },
|
|
||||||
{ "topcir", "⫱" },
|
|
||||||
{ "tprime", "‴" },
|
|
||||||
{ "utdot", "⋰" },
|
|
||||||
{ "uwangle", "⦧" },
|
|
||||||
{ "vangrt", "⦜" },
|
|
||||||
{ "veeeq", "≚" },
|
|
||||||
{ "Verbar", "‖" },
|
|
||||||
{ "wedgeq", "≙" },
|
|
||||||
{ "xnis", "⋻" },
|
|
||||||
{ "boxDL", "╗" },
|
|
||||||
{ "boxDl", "╖" },
|
|
||||||
{ "boxdL", "╕" },
|
|
||||||
{ "boxdl", "┐" },
|
|
||||||
{ "boxDR", "╔" },
|
|
||||||
{ "boxDr", "╓" },
|
|
||||||
{ "boxdR", "╒" },
|
|
||||||
{ "boxdr", "┌" },
|
|
||||||
{ "boxH", "═" },
|
|
||||||
{ "boxh", "─" },
|
|
||||||
{ "boxHD", "╦" },
|
|
||||||
{ "boxHd", "╤" },
|
|
||||||
{ "boxhD", "╥" },
|
|
||||||
{ "boxhd", "┬" },
|
|
||||||
{ "boxHU", "╩" },
|
|
||||||
{ "boxHu", "╧" },
|
|
||||||
{ "boxhU", "╨" },
|
|
||||||
{ "boxhu", "┴" },
|
|
||||||
{ "boxUL", "╝" },
|
|
||||||
{ "boxUl", "╜" },
|
|
||||||
{ "boxuL", "╛" },
|
|
||||||
{ "boxul", "┘" },
|
|
||||||
{ "boxUR", "╚" },
|
|
||||||
{ "boxUr", "╙" },
|
|
||||||
{ "boxuR", "╘" },
|
|
||||||
{ "boxur", "└" },
|
|
||||||
{ "boxV", "║" },
|
|
||||||
{ "boxv", "│" },
|
|
||||||
{ "boxVH", "╬" },
|
|
||||||
{ "boxVh", "╫" },
|
|
||||||
{ "boxvH", "╪" },
|
|
||||||
{ "boxvh", "┼" },
|
|
||||||
{ "boxVL", "╣" },
|
|
||||||
{ "boxVl", "╢" },
|
|
||||||
{ "boxvL", "╡" },
|
|
||||||
{ "boxvl", "┤" },
|
|
||||||
{ "boxVR", "╠" },
|
|
||||||
{ "boxVr", "╟" },
|
|
||||||
{ "boxvR", "╞" },
|
|
||||||
{ "boxvr", "├" },
|
|
||||||
{ "Acy", "А" },
|
|
||||||
{ "acy", "а" },
|
|
||||||
{ "Bcy", "Б" },
|
|
||||||
{ "bcy", "б" },
|
|
||||||
{ "CHcy", "Ч" },
|
|
||||||
{ "chcy", "ч" },
|
|
||||||
{ "Dcy", "Д" },
|
|
||||||
{ "dcy", "д" },
|
|
||||||
{ "Ecy", "Э" },
|
|
||||||
{ "ecy", "э" },
|
|
||||||
{ "Fcy", "Ф" },
|
|
||||||
{ "fcy", "ф" },
|
|
||||||
{ "Gcy", "Г" },
|
|
||||||
{ "gcy", "г" },
|
|
||||||
{ "HARDcy", "Ъ" },
|
|
||||||
{ "hardcy", "ъ" },
|
|
||||||
{ "Icy", "И" },
|
|
||||||
{ "icy", "и" },
|
|
||||||
{ "IEcy", "Е" },
|
|
||||||
{ "iecy", "е" },
|
|
||||||
{ "IOcy", "Ё" },
|
|
||||||
{ "iocy", "ё" },
|
|
||||||
{ "Jcy", "Й" },
|
|
||||||
{ "jcy", "й" },
|
|
||||||
{ "Kcy", "К" },
|
|
||||||
{ "kcy", "к" },
|
|
||||||
{ "KHcy", "Х" },
|
|
||||||
{ "khcy", "х" },
|
|
||||||
{ "Lcy", "Л" },
|
|
||||||
{ "lcy", "л" },
|
|
||||||
{ "Mcy", "М" },
|
|
||||||
{ "mcy", "м" },
|
|
||||||
{ "Ncy", "Н" },
|
|
||||||
{ "ncy", "н" },
|
|
||||||
{ "numero", "№" },
|
|
||||||
{ "Ocy", "О" },
|
|
||||||
{ "ocy", "о" },
|
|
||||||
{ "Pcy", "П" },
|
|
||||||
{ "pcy", "п" },
|
|
||||||
{ "Rcy", "Р" },
|
|
||||||
{ "rcy", "р" },
|
|
||||||
{ "Scy", "С" },
|
|
||||||
{ "scy", "с" },
|
|
||||||
{ "SHCHcy", "Щ" },
|
|
||||||
{ "shchcy", "щ" },
|
|
||||||
{ "SHcy", "Ш" },
|
|
||||||
{ "shcy", "ш" },
|
|
||||||
{ "SOFTcy", "Ь" },
|
|
||||||
{ "softcy", "ь" },
|
|
||||||
{ "Tcy", "Т" },
|
|
||||||
{ "tcy", "т" },
|
|
||||||
{ "TScy", "Ц" },
|
|
||||||
{ "tscy", "ц" },
|
|
||||||
{ "Ucy", "У" },
|
|
||||||
{ "ucy", "у" },
|
|
||||||
{ "Vcy", "В" },
|
|
||||||
{ "vcy", "в" },
|
|
||||||
{ "YAcy", "Я" },
|
|
||||||
{ "yacy", "я" },
|
|
||||||
{ "Ycy", "Ы" },
|
|
||||||
{ "ycy", "ы" },
|
|
||||||
{ "YUcy", "Ю" },
|
|
||||||
{ "yucy", "ю" },
|
|
||||||
{ "Zcy", "З" },
|
|
||||||
{ "zcy", "з" },
|
|
||||||
{ "ZHcy", "Ж" },
|
|
||||||
{ "zhcy", "ж" },
|
|
||||||
{ "DJcy", "Ђ" },
|
|
||||||
{ "djcy", "ђ" },
|
|
||||||
{ "DScy", "Ѕ" },
|
|
||||||
{ "dscy", "ѕ" },
|
|
||||||
{ "DZcy", "Џ" },
|
|
||||||
{ "dzcy", "џ" },
|
|
||||||
{ "GJcy", "Ѓ" },
|
|
||||||
{ "gjcy", "ѓ" },
|
|
||||||
{ "Iukcy", "І" },
|
|
||||||
{ "iukcy", "і" },
|
|
||||||
{ "Jsercy", "Ј" },
|
|
||||||
{ "jsercy", "ј" },
|
|
||||||
{ "Jukcy", "Є" },
|
|
||||||
{ "jukcy", "є" },
|
|
||||||
{ "KJcy", "Ќ" },
|
|
||||||
{ "kjcy", "ќ" },
|
|
||||||
{ "LJcy", "Љ" },
|
|
||||||
{ "ljcy", "љ" },
|
|
||||||
{ "NJcy", "Њ" },
|
|
||||||
{ "njcy", "њ" },
|
|
||||||
{ "TSHcy", "Ћ" },
|
|
||||||
{ "tshcy", "ћ" },
|
|
||||||
{ "Ubrcy", "Ў" },
|
|
||||||
{ "ubrcy", "ў" },
|
|
||||||
{ "YIcy", "Ї" },
|
|
||||||
{ "yicy", "ї" },
|
|
||||||
{ "acute", "´" },
|
|
||||||
{ "breve", "˘" },
|
|
||||||
{ "caron", "ˇ" },
|
|
||||||
{ "cedil", "¸" },
|
|
||||||
{ "circ", "ˆ" },
|
|
||||||
{ "dblac", "˝" },
|
|
||||||
{ "die", "¨" },
|
|
||||||
{ "dot", "˙" },
|
|
||||||
{ "grave", "`" },
|
|
||||||
{ "macr", "¯" },
|
|
||||||
{ "ogon", "˛" },
|
|
||||||
{ "ring", "˚" },
|
|
||||||
{ "tilde", "˜" },
|
|
||||||
{ "uml", "¨" },
|
|
||||||
{ "Aacute", "Á" },
|
|
||||||
{ "aacute", "á" },
|
|
||||||
{ "Acirc", "Â" },
|
|
||||||
{ "acirc", "â" },
|
|
||||||
{ "AElig", "Æ" },
|
|
||||||
{ "aelig", "æ" },
|
|
||||||
{ "Agrave", "À" },
|
|
||||||
{ "agrave", "à" },
|
|
||||||
{ "Aring", "Å" },
|
|
||||||
{ "aring", "å" },
|
|
||||||
{ "Atilde", "Ã" },
|
|
||||||
{ "atilde", "ã" },
|
|
||||||
{ "Auml", "Ä" },
|
|
||||||
{ "auml", "ä" },
|
|
||||||
{ "Ccedil", "Ç" },
|
|
||||||
{ "ccedil", "ç" },
|
|
||||||
{ "Eacute", "É" },
|
|
||||||
{ "eacute", "é" },
|
|
||||||
{ "Ecirc", "Ê" },
|
|
||||||
{ "ecirc", "ê" },
|
|
||||||
{ "Egrave", "È" },
|
|
||||||
{ "egrave", "è" },
|
|
||||||
{ "ETH", "Ð" },
|
|
||||||
{ "eth", "ð" },
|
|
||||||
{ "Euml", "Ë" },
|
|
||||||
{ "euml", "ë" },
|
|
||||||
{ "Iacute", "Í" },
|
|
||||||
{ "iacute", "í" },
|
|
||||||
{ "Icirc", "Î" },
|
|
||||||
{ "icirc", "î" },
|
|
||||||
{ "Igrave", "Ì" },
|
|
||||||
{ "igrave", "ì" },
|
|
||||||
{ "Iuml", "Ï" },
|
|
||||||
{ "iuml", "ï" },
|
|
||||||
{ "Ntilde", "Ñ" },
|
|
||||||
{ "ntilde", "ñ" },
|
|
||||||
{ "Oacute", "Ó" },
|
|
||||||
{ "oacute", "ó" },
|
|
||||||
{ "Ocirc", "Ô" },
|
|
||||||
{ "ocirc", "ô" },
|
|
||||||
{ "Ograve", "Ò" },
|
|
||||||
{ "ograve", "ò" },
|
|
||||||
{ "Oslash", "Ø" },
|
|
||||||
{ "oslash", "ø" },
|
|
||||||
{ "Otilde", "Õ" },
|
|
||||||
{ "otilde", "õ" },
|
|
||||||
{ "Ouml", "Ö" },
|
|
||||||
{ "ouml", "ö" },
|
|
||||||
{ "szlig", "ß" },
|
|
||||||
{ "THORN", "Þ" },
|
|
||||||
{ "thorn", "þ" },
|
|
||||||
{ "Uacute", "Ú" },
|
|
||||||
{ "uacute", "ú" },
|
|
||||||
{ "Ucirc", "Û" },
|
|
||||||
{ "ucirc", "û" },
|
|
||||||
{ "Ugrave", "Ù" },
|
|
||||||
{ "ugrave", "ù" },
|
|
||||||
{ "Uuml", "Ü" },
|
|
||||||
{ "uuml", "ü" },
|
|
||||||
{ "Yacute", "Ý" },
|
|
||||||
{ "yacute", "ý" },
|
|
||||||
{ "yuml", "ÿ" },
|
|
||||||
{ "Abreve", "Ă" },
|
|
||||||
{ "abreve", "ă" },
|
|
||||||
{ "Amacr", "Ā" },
|
|
||||||
{ "amacr", "ā" },
|
|
||||||
{ "Aogon", "Ą" },
|
|
||||||
{ "aogon", "ą" },
|
|
||||||
{ "Cacute", "Ć" },
|
|
||||||
{ "cacute", "ć" },
|
|
||||||
{ "Ccaron", "Č" },
|
|
||||||
{ "ccaron", "č" },
|
|
||||||
{ "Ccirc", "Ĉ" },
|
|
||||||
{ "ccirc", "ĉ" },
|
|
||||||
{ "Cdot", "Ċ" },
|
|
||||||
{ "cdot", "ċ" },
|
|
||||||
{ "Dcaron", "Ď" },
|
|
||||||
{ "dcaron", "ď" },
|
|
||||||
{ "Dstrok", "Đ" },
|
|
||||||
{ "dstrok", "đ" },
|
|
||||||
{ "Ecaron", "Ě" },
|
|
||||||
{ "ecaron", "ě" },
|
|
||||||
{ "Edot", "Ė" },
|
|
||||||
{ "edot", "ė" },
|
|
||||||
{ "Emacr", "Ē" },
|
|
||||||
{ "emacr", "ē" },
|
|
||||||
{ "ENG", "Ŋ" },
|
|
||||||
{ "eng", "ŋ" },
|
|
||||||
{ "Eogon", "Ę" },
|
|
||||||
{ "eogon", "ę" },
|
|
||||||
{ "gacute", "ǵ" },
|
|
||||||
{ "Gbreve", "Ğ" },
|
|
||||||
{ "gbreve", "ğ" },
|
|
||||||
{ "Gcedil", "Ģ" },
|
|
||||||
{ "Gcirc", "Ĝ" },
|
|
||||||
{ "gcirc", "ĝ" },
|
|
||||||
{ "Gdot", "Ġ" },
|
|
||||||
{ "gdot", "ġ" },
|
|
||||||
{ "Hcirc", "Ĥ" },
|
|
||||||
{ "hcirc", "ĥ" },
|
|
||||||
{ "Hstrok", "Ħ" },
|
|
||||||
{ "hstrok", "ħ" },
|
|
||||||
{ "Idot", "İ" },
|
|
||||||
{ "IJlig", "IJ" },
|
|
||||||
{ "ijlig", "ij" },
|
|
||||||
{ "Imacr", "Ī" },
|
|
||||||
{ "imacr", "ī" },
|
|
||||||
{ "inodot", "ı" },
|
|
||||||
{ "Iogon", "Į" },
|
|
||||||
{ "iogon", "į" },
|
|
||||||
{ "Itilde", "Ĩ" },
|
|
||||||
{ "itilde", "ĩ" },
|
|
||||||
{ "Jcirc", "Ĵ" },
|
|
||||||
{ "jcirc", "ĵ" },
|
|
||||||
{ "Kcedil", "Ķ" },
|
|
||||||
{ "kcedil", "ķ" },
|
|
||||||
{ "kgreen", "ĸ" },
|
|
||||||
{ "Lacute", "Ĺ" },
|
|
||||||
{ "lacute", "ĺ" },
|
|
||||||
{ "Lcaron", "Ľ" },
|
|
||||||
{ "lcaron", "ľ" },
|
|
||||||
{ "Lcedil", "Ļ" },
|
|
||||||
{ "lcedil", "ļ" },
|
|
||||||
{ "Lmidot", "Ŀ" },
|
|
||||||
{ "lmidot", "ŀ" },
|
|
||||||
{ "Lstrok", "Ł" },
|
|
||||||
{ "lstrok", "ł" },
|
|
||||||
{ "Nacute", "Ń" },
|
|
||||||
{ "nacute", "ń" },
|
|
||||||
{ "napos", "ʼn" },
|
|
||||||
{ "Ncaron", "Ň" },
|
|
||||||
{ "ncaron", "ň" },
|
|
||||||
{ "Ncedil", "Ņ" },
|
|
||||||
{ "ncedil", "ņ" },
|
|
||||||
{ "Odblac", "Ő" },
|
|
||||||
{ "odblac", "ő" },
|
|
||||||
{ "OElig", "Œ" },
|
|
||||||
{ "oelig", "œ" },
|
|
||||||
{ "Omacr", "Ō" },
|
|
||||||
{ "omacr", "ō" },
|
|
||||||
{ "Racute", "Ŕ" },
|
|
||||||
{ "racute", "ŕ" },
|
|
||||||
{ "Rcaron", "Ř" },
|
|
||||||
{ "rcaron", "ř" },
|
|
||||||
{ "Rcedil", "Ŗ" },
|
|
||||||
{ "rcedil", "ŗ" },
|
|
||||||
{ "Sacute", "Ś" },
|
|
||||||
{ "sacute", "ś" },
|
|
||||||
{ "Scaron", "Š" },
|
|
||||||
{ "scaron", "š" },
|
|
||||||
{ "Scedil", "Ş" },
|
|
||||||
{ "scedil", "ş" },
|
|
||||||
{ "Scirc", "Ŝ" },
|
|
||||||
{ "scirc", "ŝ" },
|
|
||||||
{ "Tcaron", "Ť" },
|
|
||||||
{ "tcaron", "ť" },
|
|
||||||
{ "Tcedil", "Ţ" },
|
|
||||||
{ "tcedil", "ţ" },
|
|
||||||
{ "Tstrok", "Ŧ" },
|
|
||||||
{ "tstrok", "ŧ" },
|
|
||||||
{ "Ubreve", "Ŭ" },
|
|
||||||
{ "ubreve", "ŭ" },
|
|
||||||
{ "Udblac", "Ű" },
|
|
||||||
{ "udblac", "ű" },
|
|
||||||
{ "Umacr", "Ū" },
|
|
||||||
{ "umacr", "ū" },
|
|
||||||
{ "Uogon", "Ų" },
|
|
||||||
{ "uogon", "ų" },
|
|
||||||
{ "Uring", "Ů" },
|
|
||||||
{ "uring", "ů" },
|
|
||||||
{ "Utilde", "Ũ" },
|
|
||||||
{ "utilde", "ũ" },
|
|
||||||
{ "Wcirc", "Ŵ" },
|
|
||||||
{ "wcirc", "ŵ" },
|
|
||||||
{ "Ycirc", "Ŷ" },
|
|
||||||
{ "ycirc", "ŷ" },
|
|
||||||
{ "Yuml", "Ÿ" },
|
|
||||||
{ "Zacute", "Ź" },
|
|
||||||
{ "zacute", "ź" },
|
|
||||||
{ "Zcaron", "Ž" },
|
|
||||||
{ "zcaron", "ž" },
|
|
||||||
{ "Zdot", "Ż" },
|
|
||||||
{ "zdot", "ż" },
|
|
||||||
{ "apos", "'" },
|
|
||||||
{ "ast", "*" },
|
|
||||||
{ "brvbar", "¦" },
|
|
||||||
{ "bsol", "\" },
|
|
||||||
{ "cent", "¢" },
|
|
||||||
{ "colon", ":" },
|
|
||||||
{ "comma", "," },
|
|
||||||
{ "commat", "@" },
|
|
||||||
{ "copy", "©" },
|
|
||||||
{ "curren", "¤" },
|
|
||||||
{ "darr", "↓" },
|
|
||||||
{ "deg", "°" },
|
|
||||||
{ "divide", "÷" },
|
|
||||||
{ "dollar", "$" },
|
|
||||||
{ "equals", "=" },
|
|
||||||
{ "excl", "!" },
|
|
||||||
{ "frac12", "½" },
|
|
||||||
{ "frac14", "¼" },
|
|
||||||
{ "frac18", "⅛" },
|
|
||||||
{ "frac34", "¾" },
|
|
||||||
{ "frac38", "⅜" },
|
|
||||||
{ "frac58", "⅝" },
|
|
||||||
{ "frac78", "⅞" },
|
|
||||||
{ "gt", ">" },
|
|
||||||
{ "half", "½" },
|
|
||||||
{ "horbar", "―" },
|
|
||||||
{ "hyphen", "‐" },
|
|
||||||
{ "iexcl", "¡" },
|
|
||||||
{ "iquest", "¿" },
|
|
||||||
{ "laquo", "«" },
|
|
||||||
{ "larr", "←" },
|
|
||||||
{ "lcub", "{" },
|
|
||||||
{ "ldquo", "“" },
|
|
||||||
{ "lowbar", "_" },
|
|
||||||
{ "lpar", "(" },
|
|
||||||
{ "lsqb", "[" },
|
|
||||||
{ "lsquo", "‘" },
|
|
||||||
{ "lt", "<" },
|
|
||||||
{ "micro", "µ" },
|
|
||||||
{ "middot", "·" },
|
|
||||||
{ "nbsp", " " },
|
|
||||||
{ "not", "¬" },
|
|
||||||
{ "num", "#" },
|
|
||||||
{ "ohm", "Ω" },
|
|
||||||
{ "ordf", "ª" },
|
|
||||||
{ "ordm", "º" },
|
|
||||||
{ "para", "¶" },
|
|
||||||
{ "percnt", "%" },
|
|
||||||
{ "period", "." },
|
|
||||||
{ "plus", "+" },
|
|
||||||
{ "plusmn", "±" },
|
|
||||||
{ "pound", "£" },
|
|
||||||
{ "quest", "?" },
|
|
||||||
{ "quot", """ },
|
|
||||||
{ "raquo", "»" },
|
|
||||||
{ "rarr", "→" },
|
|
||||||
{ "rcub", "}" },
|
|
||||||
{ "rdquo", "”" },
|
|
||||||
{ "reg", "®" },
|
|
||||||
{ "rpar", ")" },
|
|
||||||
{ "rsqb", "]" },
|
|
||||||
{ "rsquo", "’" },
|
|
||||||
{ "sect", "§" },
|
|
||||||
{ "semi", ";" },
|
|
||||||
{ "shy", "­" },
|
|
||||||
{ "sol", "/" },
|
|
||||||
{ "sung", "♪" },
|
|
||||||
{ "sup1", "¹" },
|
|
||||||
{ "sup2", "²" },
|
|
||||||
{ "sup3", "³" },
|
|
||||||
{ "times", "×" },
|
|
||||||
{ "trade", "™" },
|
|
||||||
{ "uarr", "↑" },
|
|
||||||
{ "verbar", "|" },
|
|
||||||
{ "yen", "¥" },
|
|
||||||
{ "blank", "␣" },
|
|
||||||
{ "blk12", "▒" },
|
|
||||||
{ "blk14", "░" },
|
|
||||||
{ "blk34", "▓" },
|
|
||||||
{ "block", "█" },
|
|
||||||
{ "bull", "•" },
|
|
||||||
{ "caret", "⁁" },
|
|
||||||
{ "check", "✓" },
|
|
||||||
{ "cir", "○" },
|
|
||||||
{ "clubs", "♣" },
|
|
||||||
{ "copysr", "℗" },
|
|
||||||
{ "cross", "✗" },
|
|
||||||
{ "Dagger", "‡" },
|
|
||||||
{ "dagger", "†" },
|
|
||||||
{ "dash", "‐" },
|
|
||||||
{ "diams", "♦" },
|
|
||||||
{ "dlcrop", "⌍" },
|
|
||||||
{ "drcrop", "⌌" },
|
|
||||||
{ "dtri", "▿" },
|
|
||||||
{ "dtrif", "▾" },
|
|
||||||
{ "emsp", " " },
|
|
||||||
{ "emsp13", " " },
|
|
||||||
{ "emsp14", " " },
|
|
||||||
{ "ensp", " " },
|
|
||||||
{ "female", "♀" },
|
|
||||||
{ "ffilig", "ffi" },
|
|
||||||
{ "fflig", "ff" },
|
|
||||||
{ "ffllig", "ffl" },
|
|
||||||
{ "filig", "fi" },
|
|
||||||
{ "flat", "♭" },
|
|
||||||
{ "fllig", "fl" },
|
|
||||||
{ "frac13", "⅓" },
|
|
||||||
{ "frac15", "⅕" },
|
|
||||||
{ "frac16", "⅙" },
|
|
||||||
{ "frac23", "⅔" },
|
|
||||||
{ "frac25", "⅖" },
|
|
||||||
{ "frac35", "⅗" },
|
|
||||||
{ "frac45", "⅘" },
|
|
||||||
{ "frac56", "⅚" },
|
|
||||||
{ "hairsp", " " },
|
|
||||||
{ "hearts", "♥" },
|
|
||||||
{ "hellip", "…" },
|
|
||||||
{ "hybull", "⁃" },
|
|
||||||
{ "incare", "℅" },
|
|
||||||
{ "ldquor", "„" },
|
|
||||||
{ "lhblk", "▄" },
|
|
||||||
{ "loz", "◊" },
|
|
||||||
{ "lozf", "⧫" },
|
|
||||||
{ "lsquor", "‚" },
|
|
||||||
{ "ltri", "◃" },
|
|
||||||
{ "ltrif", "◂" },
|
|
||||||
{ "male", "♂" },
|
|
||||||
{ "malt", "✠" },
|
|
||||||
{ "marker", "▮" },
|
|
||||||
{ "mdash", "—" },
|
|
||||||
{ "mldr", "…" },
|
|
||||||
{ "natur", "♮" },
|
|
||||||
{ "ndash", "–" },
|
|
||||||
{ "nldr", "‥" },
|
|
||||||
{ "numsp", " " },
|
|
||||||
{ "phone", "☎" },
|
|
||||||
{ "puncsp", " " },
|
|
||||||
{ "rdquor", "”" },
|
|
||||||
{ "rect", "▭" },
|
|
||||||
{ "rsquor", "’" },
|
|
||||||
{ "rtri", "▹" },
|
|
||||||
{ "rtrif", "▸" },
|
|
||||||
{ "rx", "℞" },
|
|
||||||
{ "sext", "✶" },
|
|
||||||
{ "sharp", "♯" },
|
|
||||||
{ "spades", "♠" },
|
|
||||||
{ "squ", "□" },
|
|
||||||
{ "squf", "▪" },
|
|
||||||
{ "star", "☆" },
|
|
||||||
{ "starf", "★" },
|
|
||||||
{ "target", "⌖" },
|
|
||||||
{ "telrec", "⌕" },
|
|
||||||
{ "thinsp", " " },
|
|
||||||
{ "uhblk", "▀" },
|
|
||||||
{ "ulcrop", "⌏" },
|
|
||||||
{ "urcrop", "⌎" },
|
|
||||||
{ "utri", "▵" },
|
|
||||||
{ "utrif", "▴" },
|
|
||||||
{ "vellip", "⋮" },
|
|
||||||
{ "af", "⁡" },
|
|
||||||
{ "asympeq", "≍" },
|
|
||||||
{ "Cross", "⨯" },
|
|
||||||
{ "DD", "ⅅ" },
|
|
||||||
{ "dd", "ⅆ" },
|
|
||||||
{ "DownArrowBar", "⤓" },
|
|
||||||
{ "DownBreve", "̑" },
|
|
||||||
{ "DownLeftRightVector", "⥐" },
|
|
||||||
{ "DownLeftTeeVector", "⥞" },
|
|
||||||
{ "DownLeftVectorBar", "⥖" },
|
|
||||||
{ "DownRightTeeVector", "⥟" },
|
|
||||||
{ "DownRightVectorBar", "⥗" },
|
|
||||||
{ "ee", "ⅇ" },
|
|
||||||
{ "EmptySmallSquare", "◻" },
|
|
||||||
{ "EmptyVerySmallSquare", "▫" },
|
|
||||||
{ "Equal", "⩵" },
|
|
||||||
{ "FilledSmallSquare", "◼" },
|
|
||||||
{ "FilledVerySmallSquare", "▪" },
|
|
||||||
{ "GreaterGreater", "⪢" },
|
|
||||||
{ "Hat", "^" },
|
|
||||||
{ "HorizontalLine", "─" },
|
|
||||||
{ "ic", "⁣" },
|
|
||||||
{ "ii", "ⅈ" },
|
|
||||||
{ "it", "⁢" },
|
|
||||||
{ "larrb", "⇤" },
|
|
||||||
{ "LeftDownTeeVector", "⥡" },
|
|
||||||
{ "LeftDownVectorBar", "⥙" },
|
|
||||||
{ "LeftRightVector", "⥎" },
|
|
||||||
{ "LeftTeeVector", "⥚" },
|
|
||||||
{ "LeftTriangleBar", "⧏" },
|
|
||||||
{ "LeftUpDownVector", "⥑" },
|
|
||||||
{ "LeftUpTeeVector", "⥠" },
|
|
||||||
{ "LeftUpVectorBar", "⥘" },
|
|
||||||
{ "LeftVectorBar", "⥒" },
|
|
||||||
{ "LessLess", "⪡" },
|
|
||||||
{ "mapstodown", "↧" },
|
|
||||||
{ "mapstoleft", "↤" },
|
|
||||||
{ "mapstoup", "↥" },
|
|
||||||
{ "MediumSpace", " " },
|
|
||||||
{ "nbump", "≎̸" },
|
|
||||||
{ "nbumpe", "≏̸" },
|
|
||||||
{ "nesim", "≂̸" },
|
|
||||||
{ "NewLine", "
" },
|
|
||||||
{ "NoBreak", "⁠" },
|
|
||||||
{ "NotCupCap", "≭" },
|
|
||||||
{ "NotHumpEqual", "≏̸" },
|
|
||||||
{ "NotLeftTriangleBar", "⧏̸" },
|
|
||||||
{ "NotNestedGreaterGreater", "⪢̸" },
|
|
||||||
{ "NotNestedLessLess", "⪡̸" },
|
|
||||||
{ "NotRightTriangleBar", "⧐̸" },
|
|
||||||
{ "NotSquareSubset", "⊏̸" },
|
|
||||||
{ "NotSquareSuperset", "⊐̸" },
|
|
||||||
{ "NotSucceedsTilde", "≿̸" },
|
|
||||||
{ "OverBar", "¯" },
|
|
||||||
{ "OverBrace", "︷" },
|
|
||||||
{ "OverBracket", "⎴" },
|
|
||||||
{ "OverParenthesis", "︵" },
|
|
||||||
{ "planckh", "ℎ" },
|
|
||||||
{ "Product", "∏" },
|
|
||||||
{ "rarrb", "⇥" },
|
|
||||||
{ "RightDownTeeVector", "⥝" },
|
|
||||||
{ "RightDownVectorBar", "⥕" },
|
|
||||||
{ "RightTeeVector", "⥛" },
|
|
||||||
{ "RightTriangleBar", "⧐" },
|
|
||||||
{ "RightUpDownVector", "⥏" },
|
|
||||||
{ "RightUpTeeVector", "⥜" },
|
|
||||||
{ "RightUpVectorBar", "⥔" },
|
|
||||||
{ "RightVectorBar", "⥓" },
|
|
||||||
{ "RoundImplies", "⥰" },
|
|
||||||
{ "RuleDelayed", "⧴" },
|
|
||||||
{ "Tab", "	" },
|
|
||||||
{ "ThickSpace", "   " },
|
|
||||||
{ "UnderBar", "̲" },
|
|
||||||
{ "UnderBrace", "︸" },
|
|
||||||
{ "UnderBracket", "⎵" },
|
|
||||||
{ "UnderParenthesis", "︶" },
|
|
||||||
{ "UpArrowBar", "⤒" },
|
|
||||||
{ "Upsilon", "Υ" },
|
|
||||||
{ "VerticalLine", "|" },
|
|
||||||
{ "VerticalSeparator", "❘" },
|
|
||||||
{ "ZeroWidthSpace", "​" },
|
|
||||||
{ "angle", "∠" },
|
|
||||||
{ "ApplyFunction", "⁡" },
|
|
||||||
{ "approx", "≈" },
|
|
||||||
{ "approxeq", "≊" },
|
|
||||||
{ "Assign", "≔" },
|
|
||||||
{ "backcong", "≌" },
|
|
||||||
{ "backepsilon", "϶" },
|
|
||||||
{ "backprime", "‵" },
|
|
||||||
{ "backsim", "∽" },
|
|
||||||
{ "backsimeq", "⋍" },
|
|
||||||
{ "Backslash", "∖" },
|
|
||||||
{ "barwedge", "⌅" },
|
|
||||||
{ "Because", "∵" },
|
|
||||||
{ "because", "∵" },
|
|
||||||
{ "Bernoullis", "ℬ" },
|
|
||||||
{ "between", "≬" },
|
|
||||||
{ "bigcap", "⋂" },
|
|
||||||
{ "bigcirc", "◯" },
|
|
||||||
{ "bigcup", "⋃" },
|
|
||||||
{ "bigodot", "⨀" },
|
|
||||||
{ "bigoplus", "⨁" },
|
|
||||||
{ "bigotimes", "⨂" },
|
|
||||||
{ "bigsqcup", "⨆" },
|
|
||||||
{ "bigstar", "★" },
|
|
||||||
{ "bigtriangledown", "▽" },
|
|
||||||
{ "bigtriangleup", "△" },
|
|
||||||
{ "biguplus", "⨄" },
|
|
||||||
{ "bigvee", "⋁" },
|
|
||||||
{ "bigwedge", "⋀" },
|
|
||||||
{ "bkarow", "⤍" },
|
|
||||||
{ "blacklozenge", "⧫" },
|
|
||||||
{ "blacksquare", "▪" },
|
|
||||||
{ "blacktriangle", "▴" },
|
|
||||||
{ "blacktriangledown", "▾" },
|
|
||||||
{ "blacktriangleleft", "◂" },
|
|
||||||
{ "blacktriangleright", "▸" },
|
|
||||||
{ "bot", "⊥" },
|
|
||||||
{ "boxminus", "⊟" },
|
|
||||||
{ "boxplus", "⊞" },
|
|
||||||
{ "boxtimes", "⊠" },
|
|
||||||
{ "Breve", "˘" },
|
|
||||||
{ "bullet", "•" },
|
|
||||||
{ "Bumpeq", "≎" },
|
|
||||||
{ "bumpeq", "≏" },
|
|
||||||
{ "CapitalDifferentialD", "ⅅ" },
|
|
||||||
{ "Cayleys", "ℭ" },
|
|
||||||
{ "Cedilla", "¸" },
|
|
||||||
{ "CenterDot", "·" },
|
|
||||||
{ "centerdot", "·" },
|
|
||||||
{ "checkmark", "✓" },
|
|
||||||
{ "circeq", "≗" },
|
|
||||||
{ "circlearrowleft", "↺" },
|
|
||||||
{ "circlearrowright", "↻" },
|
|
||||||
{ "circledast", "⊛" },
|
|
||||||
{ "circledcirc", "⊚" },
|
|
||||||
{ "circleddash", "⊝" },
|
|
||||||
{ "CircleDot", "⊙" },
|
|
||||||
{ "circledR", "®" },
|
|
||||||
{ "circledS", "Ⓢ" },
|
|
||||||
{ "CircleMinus", "⊖" },
|
|
||||||
{ "CirclePlus", "⊕" },
|
|
||||||
{ "CircleTimes", "⊗" },
|
|
||||||
{ "ClockwiseContourIntegral", "∲" },
|
|
||||||
{ "CloseCurlyDoubleQuote", "”" },
|
|
||||||
{ "CloseCurlyQuote", "’" },
|
|
||||||
{ "clubsuit", "♣" },
|
|
||||||
{ "coloneq", "≔" },
|
|
||||||
{ "complement", "∁" },
|
|
||||||
{ "complexes", "ℂ" },
|
|
||||||
{ "Congruent", "≡" },
|
|
||||||
{ "ContourIntegral", "∮" },
|
|
||||||
{ "Coproduct", "∐" },
|
|
||||||
{ "CounterClockwiseContourIntegral", "∳" },
|
|
||||||
{ "CupCap", "≍" },
|
|
||||||
{ "curlyeqprec", "⋞" },
|
|
||||||
{ "curlyeqsucc", "⋟" },
|
|
||||||
{ "curlyvee", "⋎" },
|
|
||||||
{ "curlywedge", "⋏" },
|
|
||||||
{ "curvearrowleft", "↶" },
|
|
||||||
{ "curvearrowright", "↷" },
|
|
||||||
{ "dbkarow", "⤏" },
|
|
||||||
{ "ddagger", "‡" },
|
|
||||||
{ "ddotseq", "⩷" },
|
|
||||||
{ "Del", "∇" },
|
|
||||||
{ "DiacriticalAcute", "´" },
|
|
||||||
{ "DiacriticalDot", "˙" },
|
|
||||||
{ "DiacriticalDoubleAcute", "˝" },
|
|
||||||
{ "DiacriticalGrave", "`" },
|
|
||||||
{ "DiacriticalTilde", "˜" },
|
|
||||||
{ "Diamond", "⋄" },
|
|
||||||
{ "diamond", "⋄" },
|
|
||||||
{ "diamondsuit", "♦" },
|
|
||||||
{ "DifferentialD", "ⅆ" },
|
|
||||||
{ "digamma", "ϝ" },
|
|
||||||
{ "div", "÷" },
|
|
||||||
{ "divideontimes", "⋇" },
|
|
||||||
{ "doteq", "≐" },
|
|
||||||
{ "doteqdot", "≑" },
|
|
||||||
{ "DotEqual", "≐" },
|
|
||||||
{ "dotminus", "∸" },
|
|
||||||
{ "dotplus", "∔" },
|
|
||||||
{ "dotsquare", "⊡" },
|
|
||||||
{ "doublebarwedge", "⌆" },
|
|
||||||
{ "DoubleContourIntegral", "∯" },
|
|
||||||
{ "DoubleDot", "¨" },
|
|
||||||
{ "DoubleDownArrow", "⇓" },
|
|
||||||
{ "DoubleLeftArrow", "⇐" },
|
|
||||||
{ "DoubleLeftRightArrow", "⇔" },
|
|
||||||
{ "DoubleLeftTee", "⫤" },
|
|
||||||
{ "DoubleLongLeftArrow", "⟸" },
|
|
||||||
{ "DoubleLongLeftRightArrow", "⟺" },
|
|
||||||
{ "DoubleLongRightArrow", "⟹" },
|
|
||||||
{ "DoubleRightArrow", "⇒" },
|
|
||||||
{ "DoubleRightTee", "⊨" },
|
|
||||||
{ "DoubleUpArrow", "⇑" },
|
|
||||||
{ "DoubleUpDownArrow", "⇕" },
|
|
||||||
{ "DoubleVerticalBar", "∥" },
|
|
||||||
{ "DownArrow", "↓" },
|
|
||||||
{ "Downarrow", "⇓" },
|
|
||||||
{ "downarrow", "↓" },
|
|
||||||
{ "DownArrowUpArrow", "⇵" },
|
|
||||||
{ "downdownarrows", "⇊" },
|
|
||||||
{ "downharpoonleft", "⇃" },
|
|
||||||
{ "downharpoonright", "⇂" },
|
|
||||||
{ "DownLeftVector", "↽" },
|
|
||||||
{ "DownRightVector", "⇁" },
|
|
||||||
{ "DownTee", "⊤" },
|
|
||||||
{ "DownTeeArrow", "↧" },
|
|
||||||
{ "drbkarow", "⤐" },
|
|
||||||
{ "Element", "∈" },
|
|
||||||
{ "emptyset", "∅" },
|
|
||||||
{ "eqcirc", "≖" },
|
|
||||||
{ "eqcolon", "≕" },
|
|
||||||
{ "eqsim", "≂" },
|
|
||||||
{ "eqslantgtr", "⪖" },
|
|
||||||
{ "eqslantless", "⪕" },
|
|
||||||
{ "EqualTilde", "≂" },
|
|
||||||
{ "Equilibrium", "⇌" },
|
|
||||||
{ "Exists", "∃" },
|
|
||||||
{ "expectation", "ℰ" },
|
|
||||||
{ "ExponentialE", "ⅇ" },
|
|
||||||
{ "exponentiale", "ⅇ" },
|
|
||||||
{ "fallingdotseq", "≒" },
|
|
||||||
{ "ForAll", "∀" },
|
|
||||||
{ "Fouriertrf", "ℱ" },
|
|
||||||
{ "geq", "≥" },
|
|
||||||
{ "geqq", "≧" },
|
|
||||||
{ "geqslant", "⩾" },
|
|
||||||
{ "gg", "≫" },
|
|
||||||
{ "ggg", "⋙" },
|
|
||||||
{ "gnapprox", "⪊" },
|
|
||||||
{ "gneq", "⪈" },
|
|
||||||
{ "gneqq", "≩" },
|
|
||||||
{ "GreaterEqual", "≥" },
|
|
||||||
{ "GreaterEqualLess", "⋛" },
|
|
||||||
{ "GreaterFullEqual", "≧" },
|
|
||||||
{ "GreaterLess", "≷" },
|
|
||||||
{ "GreaterSlantEqual", "⩾" },
|
|
||||||
{ "GreaterTilde", "≳" },
|
|
||||||
{ "gtrapprox", "⪆" },
|
|
||||||
{ "gtrdot", "⋗" },
|
|
||||||
{ "gtreqless", "⋛" },
|
|
||||||
{ "gtreqqless", "⪌" },
|
|
||||||
{ "gtrless", "≷" },
|
|
||||||
{ "gtrsim", "≳" },
|
|
||||||
{ "gvertneqq", "≩︀" },
|
|
||||||
{ "Hacek", "ˇ" },
|
|
||||||
{ "hbar", "ℏ" },
|
|
||||||
{ "heartsuit", "♥" },
|
|
||||||
{ "HilbertSpace", "ℋ" },
|
|
||||||
{ "hksearow", "⤥" },
|
|
||||||
{ "hkswarow", "⤦" },
|
|
||||||
{ "hookleftarrow", "↩" },
|
|
||||||
{ "hookrightarrow", "↪" },
|
|
||||||
{ "hslash", "ℏ" },
|
|
||||||
{ "HumpDownHump", "≎" },
|
|
||||||
{ "HumpEqual", "≏" },
|
|
||||||
{ "iiiint", "⨌" },
|
|
||||||
{ "iiint", "∭" },
|
|
||||||
{ "Im", "ℑ" },
|
|
||||||
{ "ImaginaryI", "ⅈ" },
|
|
||||||
{ "imagline", "ℐ" },
|
|
||||||
{ "imagpart", "ℑ" },
|
|
||||||
{ "Implies", "⇒" },
|
|
||||||
{ "in", "∈" },
|
|
||||||
{ "integers", "ℤ" },
|
|
||||||
{ "Integral", "∫" },
|
|
||||||
{ "intercal", "⊺" },
|
|
||||||
{ "Intersection", "⋂" },
|
|
||||||
{ "intprod", "⨼" },
|
|
||||||
{ "InvisibleComma", "⁣" },
|
|
||||||
{ "InvisibleTimes", "⁢" },
|
|
||||||
{ "langle", "〈" },
|
|
||||||
{ "Laplacetrf", "ℒ" },
|
|
||||||
{ "lbrace", "{" },
|
|
||||||
{ "lbrack", "[" },
|
|
||||||
{ "LeftAngleBracket", "〈" },
|
|
||||||
{ "LeftArrow", "←" },
|
|
||||||
{ "Leftarrow", "⇐" },
|
|
||||||
{ "leftarrow", "←" },
|
|
||||||
{ "LeftArrowBar", "⇤" },
|
|
||||||
{ "LeftArrowRightArrow", "⇆" },
|
|
||||||
{ "leftarrowtail", "↢" },
|
|
||||||
{ "LeftCeiling", "⌈" },
|
|
||||||
{ "LeftDoubleBracket", "〚" },
|
|
||||||
{ "LeftDownVector", "⇃" },
|
|
||||||
{ "LeftFloor", "⌊" },
|
|
||||||
{ "leftharpoondown", "↽" },
|
|
||||||
{ "leftharpoonup", "↼" },
|
|
||||||
{ "leftleftarrows", "⇇" },
|
|
||||||
{ "LeftRightArrow", "↔" },
|
|
||||||
{ "Leftrightarrow", "⇔" },
|
|
||||||
{ "leftrightarrow", "↔" },
|
|
||||||
{ "leftrightarrows", "⇆" },
|
|
||||||
{ "leftrightharpoons", "⇋" },
|
|
||||||
{ "leftrightsquigarrow", "↭" },
|
|
||||||
{ "LeftTee", "⊣" },
|
|
||||||
{ "LeftTeeArrow", "↤" },
|
|
||||||
{ "leftthreetimes", "⋋" },
|
|
||||||
{ "LeftTriangle", "⊲" },
|
|
||||||
{ "LeftTriangleEqual", "⊴" },
|
|
||||||
{ "LeftUpVector", "↿" },
|
|
||||||
{ "LeftVector", "↼" },
|
|
||||||
{ "leq", "≤" },
|
|
||||||
{ "leqq", "≦" },
|
|
||||||
{ "leqslant", "⩽" },
|
|
||||||
{ "lessapprox", "⪅" },
|
|
||||||
{ "lessdot", "⋖" },
|
|
||||||
{ "lesseqgtr", "⋚" },
|
|
||||||
{ "lesseqqgtr", "⪋" },
|
|
||||||
{ "LessEqualGreater", "⋚" },
|
|
||||||
{ "LessFullEqual", "≦" },
|
|
||||||
{ "LessGreater", "≶" },
|
|
||||||
{ "lessgtr", "≶" },
|
|
||||||
{ "lesssim", "≲" },
|
|
||||||
{ "LessSlantEqual", "⩽" },
|
|
||||||
{ "LessTilde", "≲" },
|
|
||||||
{ "ll", "≪" },
|
|
||||||
{ "llcorner", "⌞" },
|
|
||||||
{ "Lleftarrow", "⇚" },
|
|
||||||
{ "lmoustache", "⎰" },
|
|
||||||
{ "lnapprox", "⪉" },
|
|
||||||
{ "lneq", "⪇" },
|
|
||||||
{ "lneqq", "≨" },
|
|
||||||
{ "LongLeftArrow", "⟵" },
|
|
||||||
{ "Longleftarrow", "⟸" },
|
|
||||||
{ "longleftarrow", "⟵" },
|
|
||||||
{ "LongLeftRightArrow", "⟷" },
|
|
||||||
{ "Longleftrightarrow", "⟺" },
|
|
||||||
{ "longleftrightarrow", "⟷" },
|
|
||||||
{ "longmapsto", "⟼" },
|
|
||||||
{ "LongRightArrow", "⟶" },
|
|
||||||
{ "Longrightarrow", "⟹" },
|
|
||||||
{ "longrightarrow", "⟶" },
|
|
||||||
{ "looparrowleft", "↫" },
|
|
||||||
{ "looparrowright", "↬" },
|
|
||||||
{ "LowerLeftArrow", "↙" },
|
|
||||||
{ "LowerRightArrow", "↘" },
|
|
||||||
{ "lozenge", "◊" },
|
|
||||||
{ "lrcorner", "⌟" },
|
|
||||||
{ "Lsh", "↰" },
|
|
||||||
{ "lvertneqq", "≨︀" },
|
|
||||||
{ "maltese", "✠" },
|
|
||||||
{ "mapsto", "↦" },
|
|
||||||
{ "measuredangle", "∡" },
|
|
||||||
{ "Mellintrf", "ℳ" },
|
|
||||||
{ "MinusPlus", "∓" },
|
|
||||||
{ "mp", "∓" },
|
|
||||||
{ "multimap", "⊸" },
|
|
||||||
{ "napprox", "≉" },
|
|
||||||
{ "natural", "♮" },
|
|
||||||
{ "naturals", "ℕ" },
|
|
||||||
{ "nearrow", "↗" },
|
|
||||||
{ "NegativeMediumSpace", "​" },
|
|
||||||
{ "NegativeThickSpace", "​" },
|
|
||||||
{ "NegativeThinSpace", "​" },
|
|
||||||
{ "NegativeVeryThinSpace", "​" },
|
|
||||||
{ "NestedGreaterGreater", "≫" },
|
|
||||||
{ "NestedLessLess", "≪" },
|
|
||||||
{ "nexists", "∄" },
|
|
||||||
{ "ngeq", "≱" },
|
|
||||||
{ "ngeqq", "≧̸" },
|
|
||||||
{ "ngeqslant", "⩾̸" },
|
|
||||||
{ "ngtr", "≯" },
|
|
||||||
{ "nLeftarrow", "⇍" },
|
|
||||||
{ "nleftarrow", "↚" },
|
|
||||||
{ "nLeftrightarrow", "⇎" },
|
|
||||||
{ "nleftrightarrow", "↮" },
|
|
||||||
{ "nleq", "≰" },
|
|
||||||
{ "nleqq", "≦̸" },
|
|
||||||
{ "nleqslant", "⩽̸" },
|
|
||||||
{ "nless", "≮" },
|
|
||||||
{ "NonBreakingSpace", " " },
|
|
||||||
{ "NotCongruent", "≢" },
|
|
||||||
{ "NotDoubleVerticalBar", "∦" },
|
|
||||||
{ "NotElement", "∉" },
|
|
||||||
{ "NotEqual", "≠" },
|
|
||||||
{ "NotEqualTilde", "≂̸" },
|
|
||||||
{ "NotExists", "∄" },
|
|
||||||
{ "NotGreater", "≯" },
|
|
||||||
{ "NotGreaterEqual", "≱" },
|
|
||||||
{ "NotGreaterFullEqual", "≦̸" },
|
|
||||||
{ "NotGreaterGreater", "≫̸" },
|
|
||||||
{ "NotGreaterLess", "≹" },
|
|
||||||
{ "NotGreaterSlantEqual", "⩾̸" },
|
|
||||||
{ "NotGreaterTilde", "≵" },
|
|
||||||
{ "NotHumpDownHump", "≎̸" },
|
|
||||||
{ "NotLeftTriangle", "⋪" },
|
|
||||||
{ "NotLeftTriangleEqual", "⋬" },
|
|
||||||
{ "NotLess", "≮" },
|
|
||||||
{ "NotLessEqual", "≰" },
|
|
||||||
{ "NotLessGreater", "≸" },
|
|
||||||
{ "NotLessLess", "≪̸" },
|
|
||||||
{ "NotLessSlantEqual", "⩽̸" },
|
|
||||||
{ "NotLessTilde", "≴" },
|
|
||||||
{ "NotPrecedes", "⊀" },
|
|
||||||
{ "NotPrecedesEqual", "⪯̸" },
|
|
||||||
{ "NotPrecedesSlantEqual", "⋠" },
|
|
||||||
{ "NotReverseElement", "∌" },
|
|
||||||
{ "NotRightTriangle", "⋫" },
|
|
||||||
{ "NotRightTriangleEqual", "⋭" },
|
|
||||||
{ "NotSquareSubsetEqual", "⋢" },
|
|
||||||
{ "NotSquareSupersetEqual", "⋣" },
|
|
||||||
{ "NotSubset", "⊂⃒" },
|
|
||||||
{ "NotSubsetEqual", "⊈" },
|
|
||||||
{ "NotSucceeds", "⊁" },
|
|
||||||
{ "NotSucceedsEqual", "⪰̸" },
|
|
||||||
{ "NotSucceedsSlantEqual", "⋡" },
|
|
||||||
{ "NotSuperset", "⊃⃒" },
|
|
||||||
{ "NotSupersetEqual", "⊉" },
|
|
||||||
{ "NotTilde", "≁" },
|
|
||||||
{ "NotTildeEqual", "≄" },
|
|
||||||
{ "NotTildeFullEqual", "≇" },
|
|
||||||
{ "NotTildeTilde", "≉" },
|
|
||||||
{ "NotVerticalBar", "∤" },
|
|
||||||
{ "nparallel", "∦" },
|
|
||||||
{ "nprec", "⊀" },
|
|
||||||
{ "npreceq", "⪯̸" },
|
|
||||||
{ "nRightarrow", "⇏" },
|
|
||||||
{ "nrightarrow", "↛" },
|
|
||||||
{ "nshortmid", "∤" },
|
|
||||||
{ "nshortparallel", "∦" },
|
|
||||||
{ "nsimeq", "≄" },
|
|
||||||
{ "nsubset", "⊂⃒" },
|
|
||||||
{ "nsubseteq", "⊈" },
|
|
||||||
{ "nsubseteqq", "⫅̸" },
|
|
||||||
{ "nsucc", "⊁" },
|
|
||||||
{ "nsucceq", "⪰̸" },
|
|
||||||
{ "nsupset", "⊃⃒" },
|
|
||||||
{ "nsupseteq", "⊉" },
|
|
||||||
{ "nsupseteqq", "⫆̸" },
|
|
||||||
{ "ntriangleleft", "⋪" },
|
|
||||||
{ "ntrianglelefteq", "⋬" },
|
|
||||||
{ "ntriangleright", "⋫" },
|
|
||||||
{ "ntrianglerighteq", "⋭" },
|
|
||||||
{ "nwarrow", "↖" },
|
|
||||||
{ "oint", "∮" },
|
|
||||||
{ "OpenCurlyDoubleQuote", "“" },
|
|
||||||
{ "OpenCurlyQuote", "‘" },
|
|
||||||
{ "orderof", "ℴ" },
|
|
||||||
{ "parallel", "∥" },
|
|
||||||
{ "PartialD", "∂" },
|
|
||||||
{ "pitchfork", "⋔" },
|
|
||||||
{ "PlusMinus", "±" },
|
|
||||||
{ "pm", "±" },
|
|
||||||
{ "Poincareplane", "ℌ" },
|
|
||||||
{ "prec", "≺" },
|
|
||||||
{ "precapprox", "⪷" },
|
|
||||||
{ "preccurlyeq", "≼" },
|
|
||||||
{ "Precedes", "≺" },
|
|
||||||
{ "PrecedesEqual", "⪯" },
|
|
||||||
{ "PrecedesSlantEqual", "≼" },
|
|
||||||
{ "PrecedesTilde", "≾" },
|
|
||||||
{ "preceq", "⪯" },
|
|
||||||
{ "precnapprox", "⪹" },
|
|
||||||
{ "precneqq", "⪵" },
|
|
||||||
{ "precnsim", "⋨" },
|
|
||||||
{ "precsim", "≾" },
|
|
||||||
{ "primes", "ℙ" },
|
|
||||||
{ "Proportion", "∷" },
|
|
||||||
{ "Proportional", "∝" },
|
|
||||||
{ "propto", "∝" },
|
|
||||||
{ "quaternions", "ℍ" },
|
|
||||||
{ "questeq", "≟" },
|
|
||||||
{ "rangle", "〉" },
|
|
||||||
{ "rationals", "ℚ" },
|
|
||||||
{ "rbrace", "}" },
|
|
||||||
{ "rbrack", "]" },
|
|
||||||
{ "Re", "ℜ" },
|
|
||||||
{ "realine", "ℛ" },
|
|
||||||
{ "realpart", "ℜ" },
|
|
||||||
{ "reals", "ℝ" },
|
|
||||||
{ "ReverseElement", "∋" },
|
|
||||||
{ "ReverseEquilibrium", "⇋" },
|
|
||||||
{ "ReverseUpEquilibrium", "⥯" },
|
|
||||||
{ "RightAngleBracket", "〉" },
|
|
||||||
{ "RightArrow", "→" },
|
|
||||||
{ "Rightarrow", "⇒" },
|
|
||||||
{ "rightarrow", "→" },
|
|
||||||
{ "RightArrowBar", "⇥" },
|
|
||||||
{ "RightArrowLeftArrow", "⇄" },
|
|
||||||
{ "rightarrowtail", "↣" },
|
|
||||||
{ "RightCeiling", "⌉" },
|
|
||||||
{ "RightDoubleBracket", "〛" },
|
|
||||||
{ "RightDownVector", "⇂" },
|
|
||||||
{ "RightFloor", "⌋" },
|
|
||||||
{ "rightharpoondown", "⇁" },
|
|
||||||
{ "rightharpoonup", "⇀" },
|
|
||||||
{ "rightleftarrows", "⇄" },
|
|
||||||
{ "rightleftharpoons", "⇌" },
|
|
||||||
{ "rightrightarrows", "⇉" },
|
|
||||||
{ "rightsquigarrow", "↝" },
|
|
||||||
{ "RightTee", "⊢" },
|
|
||||||
{ "RightTeeArrow", "↦" },
|
|
||||||
{ "rightthreetimes", "⋌" },
|
|
||||||
{ "RightTriangle", "⊳" },
|
|
||||||
{ "RightTriangleEqual", "⊵" },
|
|
||||||
{ "RightUpVector", "↾" },
|
|
||||||
{ "RightVector", "⇀" },
|
|
||||||
{ "risingdotseq", "≓" },
|
|
||||||
{ "rmoustache", "⎱" },
|
|
||||||
{ "Rrightarrow", "⇛" },
|
|
||||||
{ "Rsh", "↱" },
|
|
||||||
{ "searrow", "↘" },
|
|
||||||
{ "setminus", "∖" },
|
|
||||||
{ "ShortDownArrow", "↓" },
|
|
||||||
{ "ShortLeftArrow", "←" },
|
|
||||||
{ "shortmid", "∣" },
|
|
||||||
{ "shortparallel", "∥" },
|
|
||||||
{ "ShortRightArrow", "→" },
|
|
||||||
{ "ShortUpArrow", "↑" },
|
|
||||||
{ "simeq", "≃" },
|
|
||||||
{ "SmallCircle", "∘" },
|
|
||||||
{ "smallsetminus", "∖" },
|
|
||||||
{ "spadesuit", "♠" },
|
|
||||||
{ "Sqrt", "√" },
|
|
||||||
{ "sqsubset", "⊏" },
|
|
||||||
{ "sqsubseteq", "⊑" },
|
|
||||||
{ "sqsupset", "⊐" },
|
|
||||||
{ "sqsupseteq", "⊒" },
|
|
||||||
{ "Square", "□" },
|
|
||||||
{ "SquareIntersection", "⊓" },
|
|
||||||
{ "SquareSubset", "⊏" },
|
|
||||||
{ "SquareSubsetEqual", "⊑" },
|
|
||||||
{ "SquareSuperset", "⊐" },
|
|
||||||
{ "SquareSupersetEqual", "⊒" },
|
|
||||||
{ "SquareUnion", "⊔" },
|
|
||||||
{ "Star", "⋆" },
|
|
||||||
{ "straightepsilon", "ε" },
|
|
||||||
{ "straightphi", "ϕ" },
|
|
||||||
{ "Subset", "⋐" },
|
|
||||||
{ "subset", "⊂" },
|
|
||||||
{ "subseteq", "⊆" },
|
|
||||||
{ "subseteqq", "⫅" },
|
|
||||||
{ "SubsetEqual", "⊆" },
|
|
||||||
{ "subsetneq", "⊊" },
|
|
||||||
{ "subsetneqq", "⫋" },
|
|
||||||
{ "succ", "≻" },
|
|
||||||
{ "succapprox", "⪸" },
|
|
||||||
{ "succcurlyeq", "≽" },
|
|
||||||
{ "Succeeds", "≻" },
|
|
||||||
{ "SucceedsEqual", "⪰" },
|
|
||||||
{ "SucceedsSlantEqual", "≽" },
|
|
||||||
{ "SucceedsTilde", "≿" },
|
|
||||||
{ "succeq", "⪰" },
|
|
||||||
{ "succnapprox", "⪺" },
|
|
||||||
{ "succneqq", "⪶" },
|
|
||||||
{ "succnsim", "⋩" },
|
|
||||||
{ "succsim", "≿" },
|
|
||||||
{ "SuchThat", "∋" },
|
|
||||||
{ "Sum", "∑" },
|
|
||||||
{ "Superset", "⊃" },
|
|
||||||
{ "SupersetEqual", "⊇" },
|
|
||||||
{ "Supset", "⋑" },
|
|
||||||
{ "supset", "⊃" },
|
|
||||||
{ "supseteq", "⊇" },
|
|
||||||
{ "supseteqq", "⫆" },
|
|
||||||
{ "supsetneq", "⊋" },
|
|
||||||
{ "supsetneqq", "⫌" },
|
|
||||||
{ "swarrow", "↙" },
|
|
||||||
{ "Therefore", "∴" },
|
|
||||||
{ "therefore", "∴" },
|
|
||||||
{ "thickapprox", "≈" },
|
|
||||||
{ "thicksim", "∼" },
|
|
||||||
{ "ThinSpace", " " },
|
|
||||||
{ "Tilde", "∼" },
|
|
||||||
{ "TildeEqual", "≃" },
|
|
||||||
{ "TildeFullEqual", "≅" },
|
|
||||||
{ "TildeTilde", "≈" },
|
|
||||||
{ "toea", "⤨" },
|
|
||||||
{ "tosa", "⤩" },
|
|
||||||
{ "triangle", "▵" },
|
|
||||||
{ "triangledown", "▿" },
|
|
||||||
{ "triangleleft", "◃" },
|
|
||||||
{ "trianglelefteq", "⊴" },
|
|
||||||
{ "triangleq", "≜" },
|
|
||||||
{ "triangleright", "▹" },
|
|
||||||
{ "trianglerighteq", "⊵" },
|
|
||||||
{ "TripleDot", "⃛" },
|
|
||||||
{ "twoheadleftarrow", "↞" },
|
|
||||||
{ "twoheadrightarrow", "↠" },
|
|
||||||
{ "ulcorner", "⌜" },
|
|
||||||
{ "Union", "⋃" },
|
|
||||||
{ "UnionPlus", "⊎" },
|
|
||||||
{ "UpArrow", "↑" },
|
|
||||||
{ "Uparrow", "⇑" },
|
|
||||||
{ "uparrow", "↑" },
|
|
||||||
{ "UpArrowDownArrow", "⇅" },
|
|
||||||
{ "UpDownArrow", "↕" },
|
|
||||||
{ "Updownarrow", "⇕" },
|
|
||||||
{ "updownarrow", "↕" },
|
|
||||||
{ "UpEquilibrium", "⥮" },
|
|
||||||
{ "upharpoonleft", "↿" },
|
|
||||||
{ "upharpoonright", "↾" },
|
|
||||||
{ "UpperLeftArrow", "↖" },
|
|
||||||
{ "UpperRightArrow", "↗" },
|
|
||||||
{ "upsilon", "υ" },
|
|
||||||
{ "UpTee", "⊥" },
|
|
||||||
{ "UpTeeArrow", "↥" },
|
|
||||||
{ "upuparrows", "⇈" },
|
|
||||||
{ "urcorner", "⌝" },
|
|
||||||
{ "varepsilon", "ɛ" },
|
|
||||||
{ "varkappa", "ϰ" },
|
|
||||||
{ "varnothing", "∅" },
|
|
||||||
{ "varphi", "φ" },
|
|
||||||
{ "varpi", "ϖ" },
|
|
||||||
{ "varpropto", "∝" },
|
|
||||||
{ "varrho", "ϱ" },
|
|
||||||
{ "varsigma", "ς" },
|
|
||||||
{ "varsubsetneq", "⊊︀" },
|
|
||||||
{ "varsubsetneqq", "⫋︀" },
|
|
||||||
{ "varsupsetneq", "⊋︀" },
|
|
||||||
{ "varsupsetneqq", "⫌︀" },
|
|
||||||
{ "vartheta", "ϑ" },
|
|
||||||
{ "vartriangleleft", "⊲" },
|
|
||||||
{ "vartriangleright", "⊳" },
|
|
||||||
{ "Vee", "⋁" },
|
|
||||||
{ "vee", "∨" },
|
|
||||||
{ "Vert", "‖" },
|
|
||||||
{ "vert", "|" },
|
|
||||||
{ "VerticalBar", "∣" },
|
|
||||||
{ "VerticalTilde", "≀" },
|
|
||||||
{ "VeryThinSpace", " " },
|
|
||||||
{ "Wedge", "⋀" },
|
|
||||||
{ "wedge", "∧" },
|
|
||||||
{ "wp", "℘" },
|
|
||||||
{ "wr", "≀" },
|
|
||||||
{ "zeetrf", "ℨ" },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
// *******************************************************************
|
|
||||||
// QwtMmlDocument
|
|
||||||
// *******************************************************************
|
|
||||||
|
|
||||||
QString QwtMmlDocument::fontName( QwtMathMLDocument::MmlFont type ) const
|
|
||||||
{
|
|
||||||
switch ( type )
|
|
||||||
{
|
|
||||||
case QwtMathMLDocument::NormalFont:
|
|
||||||
return m_normal_font_name;
|
|
||||||
case QwtMathMLDocument::FrakturFont:
|
|
||||||
return m_fraktur_font_name;
|
|
||||||
case QwtMathMLDocument::SansSerifFont:
|
|
||||||
return m_sans_serif_font_name;
|
|
||||||
case QwtMathMLDocument::ScriptFont:
|
|
||||||
return m_script_font_name;
|
|
||||||
case QwtMathMLDocument::MonospaceFont:
|
|
||||||
return m_monospace_font_name;
|
|
||||||
case QwtMathMLDocument::DoublestruckFont:
|
|
||||||
return m_doublestruck_font_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name )
|
|
||||||
{
|
|
||||||
switch ( type )
|
|
||||||
{
|
|
||||||
case QwtMathMLDocument::NormalFont:
|
|
||||||
m_normal_font_name = name;
|
|
||||||
break;
|
|
||||||
case QwtMathMLDocument::FrakturFont:
|
|
||||||
m_fraktur_font_name = name;
|
|
||||||
break;
|
|
||||||
case QwtMathMLDocument::SansSerifFont:
|
|
||||||
m_sans_serif_font_name = name;
|
|
||||||
break;
|
|
||||||
case QwtMathMLDocument::ScriptFont:
|
|
||||||
m_script_font_name = name;
|
|
||||||
break;
|
|
||||||
case QwtMathMLDocument::MonospaceFont:
|
|
||||||
m_monospace_font_name = name;
|
|
||||||
break;
|
|
||||||
case QwtMathMLDocument::DoublestruckFont:
|
|
||||||
m_doublestruck_font_name = name;
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMml::NodeType domToQwtMmlNodeType( const QDomNode &dom_node )
|
|
||||||
{
|
|
||||||
QwtMml::NodeType mml_type = QwtMml::NoNode;
|
|
||||||
|
|
||||||
switch ( dom_node.nodeType() )
|
|
||||||
{
|
|
||||||
case QDomNode::ElementNode:
|
|
||||||
{
|
|
||||||
QString tag = dom_node.nodeName();
|
|
||||||
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( tag );
|
|
||||||
|
|
||||||
// treat urecognised tags as mrow
|
|
||||||
if ( spec == 0 )
|
|
||||||
mml_type = QwtMml::UnknownNode;
|
|
||||||
else
|
|
||||||
mml_type = spec->type;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QDomNode::TextNode:
|
|
||||||
mml_type = QwtMml::TextNode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QDomNode::DocumentNode:
|
|
||||||
mml_type = QwtMml::MrowNode;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QDomNode::EntityReferenceNode:
|
|
||||||
// qWarning("EntityReferenceNode: name=\"" + dom_node.nodeName() + "\" value=\"" + dom_node.nodeValue() + "\"");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QDomNode::AttributeNode:
|
|
||||||
case QDomNode::CDATASectionNode:
|
|
||||||
case QDomNode::EntityNode:
|
|
||||||
case QDomNode::ProcessingInstructionNode:
|
|
||||||
case QDomNode::CommentNode:
|
|
||||||
case QDomNode::DocumentTypeNode:
|
|
||||||
case QDomNode::DocumentFragmentNode:
|
|
||||||
case QDomNode::NotationNode:
|
|
||||||
case QDomNode::BaseNode:
|
|
||||||
case QDomNode::CharacterDataNode:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mml_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QwtMmlDocument::QwtMmlDocument()
|
|
||||||
{
|
|
||||||
m_root_node = 0;
|
|
||||||
|
|
||||||
// Some defaults which happen to work on my computer,
|
|
||||||
// but probably won't work on other's
|
|
||||||
#if defined(Q_OS_WIN)
|
|
||||||
m_normal_font_name = "Times New Roman";
|
|
||||||
#else
|
|
||||||
m_normal_font_name = "Century Schoolbook L";
|
|
||||||
#endif
|
|
||||||
m_fraktur_font_name = "Fraktur";
|
|
||||||
m_sans_serif_font_name = "Luxi Sans";
|
|
||||||
m_script_font_name = "Urw Chancery L";
|
|
||||||
m_monospace_font_name = "Luxi Mono";
|
|
||||||
m_doublestruck_font_name = "Doublestruck";
|
|
||||||
m_base_font_point_size = 16;
|
|
||||||
m_foreground_color = Qt::black;
|
|
||||||
m_background_color = Qt::white;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlDocument::~QwtMmlDocument()
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::clear()
|
|
||||||
{
|
|
||||||
delete m_root_node;
|
|
||||||
m_root_node = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::dump() const
|
|
||||||
{
|
|
||||||
if ( m_root_node == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString indent;
|
|
||||||
_dump( m_root_node, indent );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::_dump( const QwtMmlNode *node, QString &indent ) const
|
|
||||||
{
|
|
||||||
if ( node == 0 ) return;
|
|
||||||
|
|
||||||
qWarning() << indent + node->toStr();
|
|
||||||
|
|
||||||
indent += " ";
|
|
||||||
const QwtMmlNode *child = node->firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
_dump( child, indent );
|
|
||||||
indent.truncate( indent.length() - 2 );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QwtMmlDocument::setContent( QString text, QString *errorMsg,
|
|
||||||
int *errorLine, int *errorColumn )
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
|
|
||||||
QString prefix = "<?xml version=\"2.0\"?>\n";
|
|
||||||
prefix.append( entityDeclarations() );
|
|
||||||
|
|
||||||
uint prefix_lines = 0;
|
|
||||||
for ( int i = 0; i < prefix.length(); ++i )
|
|
||||||
{
|
|
||||||
if ( prefix.at( i ) == '\n' )
|
|
||||||
++prefix_lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDomDocument dom;
|
|
||||||
if ( !dom.setContent( prefix + text, false, errorMsg, errorLine, errorColumn ) )
|
|
||||||
{
|
|
||||||
if ( errorLine != 0 )
|
|
||||||
*errorLine -= prefix_lines;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we don't have access to line info from now on
|
|
||||||
if ( errorLine != 0 ) *errorLine = -1;
|
|
||||||
if ( errorColumn != 0 ) *errorColumn = -1;
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
QwtMmlNode *root_node = domToMml( dom, &ok, errorMsg );
|
|
||||||
if ( !ok )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ( root_node == 0 )
|
|
||||||
{
|
|
||||||
if ( errorMsg != 0 )
|
|
||||||
*errorMsg = "empty document";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
insertChild( 0, root_node, 0 );
|
|
||||||
layout();
|
|
||||||
|
|
||||||
/* QFile of("/tmp/dump.xml");
|
|
||||||
of.open(IO_WriteOnly);
|
|
||||||
QTextStream os(&of);
|
|
||||||
os.setEncoding(QTextStream::UnicodeUTF8);
|
|
||||||
os << dom.toString(); */
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::layout()
|
|
||||||
{
|
|
||||||
if ( m_root_node == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_root_node->layout();
|
|
||||||
m_root_node->stretch();
|
|
||||||
// dump();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QwtMmlDocument::insertChild( QwtMmlNode *parent, QwtMmlNode *new_node,
|
|
||||||
QString *errorMsg )
|
|
||||||
{
|
|
||||||
if ( new_node == 0 )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
Q_ASSERT( new_node->parent() == 0
|
|
||||||
&& new_node->nextSibling() == 0
|
|
||||||
&& new_node->previousSibling() == 0 );
|
|
||||||
|
|
||||||
if ( parent != 0 )
|
|
||||||
{
|
|
||||||
if ( !mmlCheckChildType( parent->nodeType(), new_node->nodeType(), errorMsg ) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( parent == 0 )
|
|
||||||
{
|
|
||||||
if ( m_root_node == 0 )
|
|
||||||
m_root_node = new_node;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QwtMmlNode *n = m_root_node->lastSibling();
|
|
||||||
n->m_next_sibling = new_node;
|
|
||||||
new_node->m_previous_sibling = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new_node->m_parent = parent;
|
|
||||||
if ( parent->hasChildNodes() )
|
|
||||||
{
|
|
||||||
QwtMmlNode *n = parent->firstChild()->lastSibling();
|
|
||||||
n->m_next_sibling = new_node;
|
|
||||||
new_node->m_previous_sibling = n;
|
|
||||||
}
|
|
||||||
else parent->m_first_child = new_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlDocument::createNode( NodeType type,
|
|
||||||
const QwtMmlAttributeMap &mml_attr,
|
|
||||||
const QString &mml_value,
|
|
||||||
QString *errorMsg )
|
|
||||||
{
|
|
||||||
Q_ASSERT( type != NoNode );
|
|
||||||
|
|
||||||
QwtMmlNode *mml_node = 0;
|
|
||||||
|
|
||||||
if ( !mmlCheckAttributes( type, mml_attr, errorMsg ) )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch ( type )
|
|
||||||
{
|
|
||||||
case MiNode:
|
|
||||||
mml_node = new QwtMmlMiNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MnNode:
|
|
||||||
mml_node = new QwtMmlMnNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MfracNode:
|
|
||||||
mml_node = new QwtMmlMfracNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MrowNode:
|
|
||||||
mml_node = new QwtMmlMrowNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MsqrtNode:
|
|
||||||
mml_node = new QwtMmlMsqrtNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MrootNode:
|
|
||||||
mml_node = new QwtMmlMrootNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MsupNode:
|
|
||||||
mml_node = new QwtMmlMsupNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MsubNode:
|
|
||||||
mml_node = new QwtMmlMsubNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MsubsupNode:
|
|
||||||
mml_node = new QwtMmlMsubsupNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MoNode:
|
|
||||||
mml_node = new QwtMmlMoNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MstyleNode:
|
|
||||||
mml_node = new QwtMmlMstyleNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case TextNode:
|
|
||||||
mml_node = new QwtMmlTextNode( mml_value, this );
|
|
||||||
break;
|
|
||||||
case MphantomNode:
|
|
||||||
mml_node = new QwtMmlMphantomNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MfencedNode:
|
|
||||||
mml_node = new QwtMmlMfencedNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MtableNode:
|
|
||||||
mml_node = new QwtMmlMtableNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MtrNode:
|
|
||||||
mml_node = new QwtMmlMtrNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MtdNode:
|
|
||||||
mml_node = new QwtMmlMtdNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MoverNode:
|
|
||||||
mml_node = new QwtMmlMoverNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MunderNode:
|
|
||||||
mml_node = new QwtMmlMunderNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MunderoverNode:
|
|
||||||
mml_node = new QwtMmlMunderoverNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MalignMarkNode:
|
|
||||||
mml_node = new QwtMmlMalignMarkNode( this );
|
|
||||||
break;
|
|
||||||
case MerrorNode:
|
|
||||||
mml_node = new QwtMmlMerrorNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MtextNode:
|
|
||||||
mml_node = new QwtMmlMtextNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MpaddedNode:
|
|
||||||
mml_node = new QwtMmlMpaddedNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case MspaceNode:
|
|
||||||
mml_node = new QwtMmlMspaceNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case UnknownNode:
|
|
||||||
mml_node = new QwtMmlUnknownNode( this, mml_attr );
|
|
||||||
break;
|
|
||||||
case NoNode:
|
|
||||||
mml_node = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mml_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::insertOperator( QwtMmlNode *node, const QString &text )
|
|
||||||
{
|
|
||||||
QwtMmlNode *text_node = createNode( TextNode, QwtMmlAttributeMap(), text, 0 );
|
|
||||||
QwtMmlNode *mo_node = createNode( MoNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
||||||
|
|
||||||
bool ok = insertChild( node, mo_node, 0 );
|
|
||||||
Q_ASSERT( ok );
|
|
||||||
ok = insertChild( mo_node, text_node, 0 );
|
|
||||||
Q_ASSERT( ok );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlDocument::domToMml( const QDomNode &dom_node, bool *ok, QString *errorMsg )
|
|
||||||
{
|
|
||||||
// create the node
|
|
||||||
|
|
||||||
Q_ASSERT( ok != 0 );
|
|
||||||
|
|
||||||
NodeType mml_type = domToQwtMmlNodeType( dom_node );
|
|
||||||
|
|
||||||
if ( mml_type == NoNode )
|
|
||||||
{
|
|
||||||
*ok = true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDomNamedNodeMap dom_attr = dom_node.attributes();
|
|
||||||
QwtMmlAttributeMap mml_attr;
|
|
||||||
for ( int i = 0; i < dom_attr.length(); ++i )
|
|
||||||
{
|
|
||||||
QDomNode attr_node = dom_attr.item( i );
|
|
||||||
Q_ASSERT( !attr_node.nodeName().isNull() );
|
|
||||||
Q_ASSERT( !attr_node.nodeValue().isNull() );
|
|
||||||
mml_attr[attr_node.nodeName()] = attr_node.nodeValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString mml_value;
|
|
||||||
if ( mml_type == TextNode )
|
|
||||||
mml_value = dom_node.nodeValue();
|
|
||||||
QwtMmlNode *mml_node = createNode( mml_type, mml_attr, mml_value, errorMsg );
|
|
||||||
if ( mml_node == 0 )
|
|
||||||
{
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the node's children according to the child_spec
|
|
||||||
|
|
||||||
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( mml_type );
|
|
||||||
QDomNodeList dom_child_list = dom_node.childNodes();
|
|
||||||
int child_cnt = dom_child_list.count();
|
|
||||||
QwtMmlNode *mml_child = 0;
|
|
||||||
|
|
||||||
QString separator_list;
|
|
||||||
if ( mml_type == MfencedNode )
|
|
||||||
separator_list = mml_node->explicitAttribute( "separators", "," );
|
|
||||||
|
|
||||||
switch ( spec->child_spec )
|
|
||||||
{
|
|
||||||
case QwtMmlNodeSpec::ChildIgnore:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case QwtMmlNodeSpec::ImplicitMrow:
|
|
||||||
|
|
||||||
if ( child_cnt > 0 )
|
|
||||||
{
|
|
||||||
mml_child = createImplicitMrowNode( dom_node, ok, errorMsg );
|
|
||||||
if ( !*ok )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
delete mml_child;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// exact ammount of children specified - check...
|
|
||||||
if ( spec->child_spec != child_cnt )
|
|
||||||
{
|
|
||||||
if ( errorMsg != 0 )
|
|
||||||
*errorMsg = QString( "element " )
|
|
||||||
+ spec->tag
|
|
||||||
+ " requires exactly "
|
|
||||||
+ QString::number( spec->child_spec )
|
|
||||||
+ " arguments, got "
|
|
||||||
+ QString::number( child_cnt );
|
|
||||||
delete mml_node;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ...and continue just as in ChildAny
|
|
||||||
|
|
||||||
case QwtMmlNodeSpec::ChildAny:
|
|
||||||
if ( mml_type == MfencedNode )
|
|
||||||
insertOperator( mml_node, mml_node->explicitAttribute( "open", "(" ) );
|
|
||||||
|
|
||||||
for ( int i = 0; i < child_cnt; ++i )
|
|
||||||
{
|
|
||||||
QDomNode dom_child = dom_child_list.item( i );
|
|
||||||
|
|
||||||
QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg );
|
|
||||||
if ( !*ok )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( mml_type == MtableNode && mml_child->nodeType() != MtrNode )
|
|
||||||
{
|
|
||||||
QwtMmlNode *mtr_node = createNode( MtrNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
||||||
insertChild( mml_node, mtr_node, 0 );
|
|
||||||
if ( !insertChild( mtr_node, mml_child, errorMsg ) )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
delete mml_child;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ( mml_type == MtrNode && mml_child->nodeType() != MtdNode )
|
|
||||||
{
|
|
||||||
QwtMmlNode *mtd_node = createNode( MtdNode, QwtMmlAttributeMap(), QString::null, 0 );
|
|
||||||
insertChild( mml_node, mtd_node, 0 );
|
|
||||||
if ( !insertChild( mtd_node, mml_child, errorMsg ) )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
delete mml_child;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
delete mml_child;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( i < child_cnt - 1 && mml_type == MfencedNode && !separator_list.isEmpty() )
|
|
||||||
{
|
|
||||||
QChar separator;
|
|
||||||
if ( i >= ( int )separator_list.length() )
|
|
||||||
separator = separator_list.at( separator_list.length() - 1 );
|
|
||||||
else
|
|
||||||
separator = separator_list[i];
|
|
||||||
insertOperator( mml_node, QString( separator ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( mml_type == MfencedNode )
|
|
||||||
insertOperator( mml_node, mml_node->explicitAttribute( "close", ")" ) );
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
*ok = true;
|
|
||||||
return mml_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlDocument::createImplicitMrowNode( const QDomNode &dom_node, bool *ok,
|
|
||||||
QString *errorMsg )
|
|
||||||
{
|
|
||||||
QDomNodeList dom_child_list = dom_node.childNodes();
|
|
||||||
int child_cnt = dom_child_list.count();
|
|
||||||
|
|
||||||
if ( child_cnt == 0 )
|
|
||||||
{
|
|
||||||
*ok = true;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( child_cnt == 1 )
|
|
||||||
return domToMml( dom_child_list.item( 0 ), ok, errorMsg );
|
|
||||||
|
|
||||||
QwtMmlNode *mml_node = createNode( MrowNode, QwtMmlAttributeMap(),
|
|
||||||
QString::null, errorMsg );
|
|
||||||
Q_ASSERT( mml_node != 0 ); // there is no reason in heaven or hell for this to fail
|
|
||||||
|
|
||||||
for ( int i = 0; i < child_cnt; ++i )
|
|
||||||
{
|
|
||||||
QDomNode dom_child = dom_child_list.item( i );
|
|
||||||
|
|
||||||
QwtMmlNode *mml_child = domToMml( dom_child, ok, errorMsg );
|
|
||||||
if ( !*ok )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !insertChild( mml_node, mml_child, errorMsg ) )
|
|
||||||
{
|
|
||||||
delete mml_node;
|
|
||||||
delete mml_child;
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mml_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlDocument::paint( QPainter *p, const QPoint &pos ) const
|
|
||||||
{
|
|
||||||
if ( m_root_node == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* p->save();
|
|
||||||
p->setPen(Qt::blue);
|
|
||||||
p->drawLine(pos.x() - 5, pos.y(), pos.x() + 5, pos.y());
|
|
||||||
p->drawLine(pos.x(), pos.y() - 5, pos.x(), pos.y() + 5);
|
|
||||||
p->restore(); */
|
|
||||||
|
|
||||||
QRect mr = m_root_node->myRect();
|
|
||||||
m_root_node->setRelOrigin( pos - mr.topLeft() );
|
|
||||||
m_root_node->paint( p );
|
|
||||||
}
|
|
||||||
|
|
||||||
QSize QwtMmlDocument::size() const
|
|
||||||
{
|
|
||||||
if ( m_root_node == 0 )
|
|
||||||
return QSize( 0, 0 );
|
|
||||||
return m_root_node->deviceRect().size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// *******************************************************************
|
|
||||||
// QwtMmlNode
|
|
||||||
// *******************************************************************
|
|
||||||
|
|
||||||
|
|
||||||
QwtMmlNode::QwtMmlNode( NodeType type, QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
{
|
|
||||||
m_parent = 0;
|
|
||||||
m_first_child = 0;
|
|
||||||
m_next_sibling = 0;
|
|
||||||
m_previous_sibling = 0;
|
|
||||||
|
|
||||||
m_node_type = type;
|
|
||||||
m_document = document;
|
|
||||||
m_attribute_map = attribute_map;
|
|
||||||
|
|
||||||
m_my_rect = m_parent_rect = QRect( 0, 0, 0, 0 );
|
|
||||||
m_rel_origin = QPoint( 0, 0 );
|
|
||||||
m_stretched = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode::~QwtMmlNode()
|
|
||||||
{
|
|
||||||
QwtMmlNode *n = firstChild();
|
|
||||||
while ( n != 0 )
|
|
||||||
{
|
|
||||||
QwtMmlNode *tmp = n->nextSibling();
|
|
||||||
delete n;
|
|
||||||
n = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static QString rectToStr( const QRect &rect )
|
|
||||||
{
|
|
||||||
return QString( "[(%1, %2), %3x%4]" )
|
|
||||||
.arg( rect.x() )
|
|
||||||
.arg( rect.y() )
|
|
||||||
.arg( rect.width() )
|
|
||||||
.arg( rect.height() );
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlNode::toStr() const
|
|
||||||
{
|
|
||||||
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( nodeType() );
|
|
||||||
Q_ASSERT( spec != 0 );
|
|
||||||
|
|
||||||
return QString( "%1 %2 mr=%3 pr=%4 dr=%5 ro=(%7, %8) str=%9" )
|
|
||||||
.arg( spec->type_str )
|
|
||||||
.arg( ( quintptr )this, 0, 16 )
|
|
||||||
.arg( rectToStr( myRect() ) )
|
|
||||||
.arg( rectToStr( parentRect() ) )
|
|
||||||
.arg( rectToStr( deviceRect() ) )
|
|
||||||
.arg( m_rel_origin.x() )
|
|
||||||
.arg( m_rel_origin.y() )
|
|
||||||
.arg( ( int )isStretched() );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::interpretSpacing( const QString &value, bool *ok ) const
|
|
||||||
{
|
|
||||||
return ::interpretSpacing( value, em(), ex(), ok );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::basePos() const
|
|
||||||
{
|
|
||||||
QFontMetrics fm( font() );
|
|
||||||
return fm.strikeOutPos();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::underlinePos() const
|
|
||||||
{
|
|
||||||
QFontMetrics fm( font() );
|
|
||||||
return basePos() + fm.underlinePos();
|
|
||||||
}
|
|
||||||
int QwtMmlNode::overlinePos() const
|
|
||||||
{
|
|
||||||
QFontMetrics fm( font() );
|
|
||||||
return basePos() - fm.overlinePos();
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlNode::lastSibling() const
|
|
||||||
{
|
|
||||||
const QwtMmlNode *n = this;
|
|
||||||
while ( !n->isLastSibling() )
|
|
||||||
n = n->nextSibling();
|
|
||||||
return const_cast<QwtMmlNode*>( n );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlNode::firstSibling() const
|
|
||||||
{
|
|
||||||
const QwtMmlNode *n = this;
|
|
||||||
while ( !n->isFirstSibling() )
|
|
||||||
n = n->previousSibling();
|
|
||||||
return const_cast<QwtMmlNode*>( n );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::em() const
|
|
||||||
{
|
|
||||||
return QFontMetrics( font() ).boundingRect( 'm' ).width();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::ex() const
|
|
||||||
{
|
|
||||||
return QFontMetrics( font() ).boundingRect( 'x' ).height();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlNode::scriptlevel( const QwtMmlNode * ) const
|
|
||||||
{
|
|
||||||
int parent_sl;
|
|
||||||
const QwtMmlNode *p = parent();
|
|
||||||
if ( p == 0 )
|
|
||||||
parent_sl = 0;
|
|
||||||
else
|
|
||||||
parent_sl = p->scriptlevel( this );
|
|
||||||
|
|
||||||
QString expl_sl_str = explicitAttribute( "scriptlevel" );
|
|
||||||
if ( expl_sl_str.isNull() )
|
|
||||||
return parent_sl;
|
|
||||||
|
|
||||||
if ( expl_sl_str.startsWith( "+" ) || expl_sl_str.startsWith( "-" ) )
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
int expl_sl = expl_sl_str.toInt( &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
return parent_sl + expl_sl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning() << "QwtMmlNode::scriptlevel(): bad value " + expl_sl_str;
|
|
||||||
return parent_sl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int expl_sl = expl_sl_str.toInt( &ok );
|
|
||||||
if ( ok )
|
|
||||||
return expl_sl;
|
|
||||||
|
|
||||||
|
|
||||||
if ( expl_sl_str == "+" )
|
|
||||||
return parent_sl + 1;
|
|
||||||
else if ( expl_sl_str == "-" )
|
|
||||||
return parent_sl - 1;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning() << "QwtMmlNode::scriptlevel(): could not parse value: \"" + expl_sl_str + "\"";
|
|
||||||
return parent_sl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QPoint QwtMmlNode::devicePoint( const QPoint &p ) const
|
|
||||||
{
|
|
||||||
QRect mr = myRect();
|
|
||||||
QRect dr = deviceRect();
|
|
||||||
|
|
||||||
if ( isStretched() )
|
|
||||||
return dr.topLeft() + QPoint( ( p.x() - mr.left() ) * dr.width() / mr.width(),
|
|
||||||
( p.y() - mr.top() ) * dr.height() / mr.height() );
|
|
||||||
else
|
|
||||||
return dr.topLeft() + p - mr.topLeft();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlNode::inheritAttributeFromMrow( const QString &name,
|
|
||||||
const QString &def ) const
|
|
||||||
{
|
|
||||||
const QwtMmlNode *p = this;
|
|
||||||
for ( ; p != 0; p = p->parent() )
|
|
||||||
{
|
|
||||||
if ( p == this || p->nodeType() == MstyleNode )
|
|
||||||
{
|
|
||||||
QString value = p->explicitAttribute( name );
|
|
||||||
if ( !value.isNull() )
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor QwtMmlNode::color() const
|
|
||||||
{
|
|
||||||
// If we are child of <merror> return red
|
|
||||||
const QwtMmlNode *p = this;
|
|
||||||
for ( ; p != 0; p = p->parent() )
|
|
||||||
{
|
|
||||||
if ( p->nodeType() == MerrorNode )
|
|
||||||
return QColor( "red" );
|
|
||||||
}
|
|
||||||
|
|
||||||
QString value_str = inheritAttributeFromMrow( "mathcolor" );
|
|
||||||
if ( value_str.isNull() )
|
|
||||||
value_str = inheritAttributeFromMrow( "color" );
|
|
||||||
if ( value_str.isNull() )
|
|
||||||
return QColor();
|
|
||||||
|
|
||||||
return QColor( value_str );
|
|
||||||
}
|
|
||||||
|
|
||||||
QColor QwtMmlNode::background() const
|
|
||||||
{
|
|
||||||
QString value_str = inheritAttributeFromMrow( "mathbackground" );
|
|
||||||
if ( value_str.isNull() )
|
|
||||||
value_str = inheritAttributeFromMrow( "background" );
|
|
||||||
if ( value_str.isNull() )
|
|
||||||
return QColor();
|
|
||||||
|
|
||||||
return QColor( value_str );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void updateFontAttr( QwtMmlAttributeMap &font_attr, const QwtMmlNode *n,
|
|
||||||
const QString &name, const QString &preferred_name = QString::null )
|
|
||||||
{
|
|
||||||
if ( font_attr.contains( preferred_name ) || font_attr.contains( name ) )
|
|
||||||
return;
|
|
||||||
QString value = n->explicitAttribute( name );
|
|
||||||
if ( !value.isNull() )
|
|
||||||
font_attr[name] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QwtMmlAttributeMap collectFontAttributes( const QwtMmlNode *node )
|
|
||||||
{
|
|
||||||
QwtMmlAttributeMap font_attr;
|
|
||||||
|
|
||||||
for ( const QwtMmlNode *n = node; n != 0; n = n->parent() )
|
|
||||||
{
|
|
||||||
if ( n == node || n->nodeType() == QwtMml::MstyleNode )
|
|
||||||
{
|
|
||||||
updateFontAttr( font_attr, n, "mathvariant" );
|
|
||||||
updateFontAttr( font_attr, n, "mathsize" );
|
|
||||||
|
|
||||||
// depreciated attributes
|
|
||||||
updateFontAttr( font_attr, n, "fontsize", "mathsize" );
|
|
||||||
updateFontAttr( font_attr, n, "fontweight", "mathvariant" );
|
|
||||||
updateFontAttr( font_attr, n, "fontstyle", "mathvariant" );
|
|
||||||
updateFontAttr( font_attr, n, "fontfamily", "mathvariant" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return font_attr;
|
|
||||||
}
|
|
||||||
|
|
||||||
QFont QwtMmlNode::font() const
|
|
||||||
{
|
|
||||||
QFont fn( document()->fontName( QwtMathMLDocument::NormalFont ),
|
|
||||||
document()->baseFontPointSize() );
|
|
||||||
|
|
||||||
int ps = fn.pointSize();
|
|
||||||
int sl = scriptlevel();
|
|
||||||
if ( sl >= 0 )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < sl; ++i )
|
|
||||||
ps = ( int )( ps * g_script_size_multiplier );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for ( int i = 0; i > sl; --i )
|
|
||||||
ps = ( int )( ps / g_script_size_multiplier );
|
|
||||||
}
|
|
||||||
if ( ps < g_min_font_point_size )
|
|
||||||
ps = g_min_font_point_size;
|
|
||||||
fn.setPointSize( ps );
|
|
||||||
|
|
||||||
int em = QFontMetrics( fn ).boundingRect( 'm' ).width();
|
|
||||||
int ex = QFontMetrics( fn ).boundingRect( 'x' ).height();
|
|
||||||
|
|
||||||
QwtMmlAttributeMap font_attr = collectFontAttributes( this );
|
|
||||||
|
|
||||||
if ( font_attr.contains( "mathvariant" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["mathvariant"];
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
uint mv = interpretMathVariant( value, &ok );
|
|
||||||
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
if ( mv & ScriptMV )
|
|
||||||
fn.setFamily( document()->fontName( QwtMathMLDocument::ScriptFont ) );
|
|
||||||
|
|
||||||
if ( mv & FrakturMV )
|
|
||||||
fn.setFamily( document()->fontName( QwtMathMLDocument::FrakturFont ) );
|
|
||||||
|
|
||||||
if ( mv & SansSerifMV )
|
|
||||||
fn.setFamily( document()->fontName( QwtMathMLDocument::SansSerifFont ) );
|
|
||||||
|
|
||||||
if ( mv & MonospaceMV )
|
|
||||||
fn.setFamily( document()->fontName( QwtMathMLDocument::MonospaceFont ) );
|
|
||||||
|
|
||||||
if ( mv & DoubleStruckMV )
|
|
||||||
fn.setFamily( document()->fontName( QwtMathMLDocument::DoublestruckFont ) );
|
|
||||||
|
|
||||||
if ( mv & BoldMV )
|
|
||||||
fn.setBold( true );
|
|
||||||
|
|
||||||
if ( mv & ItalicMV )
|
|
||||||
fn.setItalic( true );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( font_attr.contains( "mathsize" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["mathsize"];
|
|
||||||
fn = interpretMathSize( value, fn, em, ex, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
fn = interpretDepreciatedFontAttr( font_attr, fn, em, ex );
|
|
||||||
|
|
||||||
if ( nodeType() == MiNode
|
|
||||||
&& !font_attr.contains( "mathvariant" )
|
|
||||||
&& !font_attr.contains( "fontstyle" ) )
|
|
||||||
{
|
|
||||||
const QwtMmlMiNode *mi_node = ( const QwtMmlMiNode* ) this;
|
|
||||||
if ( mi_node->text().length() == 1 )
|
|
||||||
fn.setItalic( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( nodeType() == MoNode )
|
|
||||||
{
|
|
||||||
fn.setItalic( false );
|
|
||||||
fn.setBold( false );
|
|
||||||
}
|
|
||||||
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlNode::explicitAttribute( const QString &name, const QString &def ) const
|
|
||||||
{
|
|
||||||
QwtMmlAttributeMap::const_iterator it = m_attribute_map.find( name );
|
|
||||||
if ( it != m_attribute_map.end() )
|
|
||||||
return *it;
|
|
||||||
return def;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QRect QwtMmlNode::parentRect() const
|
|
||||||
{
|
|
||||||
if ( isStretched() )
|
|
||||||
return m_parent_rect;
|
|
||||||
|
|
||||||
QRect mr = myRect();
|
|
||||||
QPoint ro = relOrigin();
|
|
||||||
|
|
||||||
return QRect( ro + mr.topLeft(), mr.size() );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void QwtMmlNode::stretchTo( const QRect &rect )
|
|
||||||
{
|
|
||||||
m_parent_rect = rect;
|
|
||||||
m_stretched = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::setRelOrigin( const QPoint &rel_origin )
|
|
||||||
{
|
|
||||||
m_rel_origin = rel_origin + QPoint( -myRect().left(), 0 );
|
|
||||||
m_stretched = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::updateMyRect()
|
|
||||||
{
|
|
||||||
m_my_rect = symbolRect();
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
m_my_rect |= child->parentRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::layout()
|
|
||||||
{
|
|
||||||
m_parent_rect = QRect( 0, 0, 0, 0 );
|
|
||||||
m_stretched = false;
|
|
||||||
m_rel_origin = QPoint( 0, 0 );
|
|
||||||
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
child->layout();
|
|
||||||
|
|
||||||
layoutSymbol();
|
|
||||||
|
|
||||||
updateMyRect();
|
|
||||||
|
|
||||||
if ( parent() == 0 )
|
|
||||||
m_rel_origin = QPoint( 0, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QRect QwtMmlNode::deviceRect() const
|
|
||||||
{
|
|
||||||
if ( parent() == 0 )
|
|
||||||
return QRect( relOrigin() + myRect().topLeft(), myRect().size() );
|
|
||||||
|
|
||||||
/* if (!isStretched()) {
|
|
||||||
QRect pdr = parent()->deviceRect();
|
|
||||||
QRect pmr = parent()->myRect();
|
|
||||||
QRect pr = parentRect();
|
|
||||||
QRect mr = myRect();
|
|
||||||
return QRect(pdr.left() + pr.left() - pmr.left(),
|
|
||||||
pdr.top() + pr.top() - pmr.top(),
|
|
||||||
mr.width(), mr.height());
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
QRect pdr = parent()->deviceRect();
|
|
||||||
QRect pr = parentRect();
|
|
||||||
QRect pmr = parent()->myRect();
|
|
||||||
|
|
||||||
float scale_w = 0;
|
|
||||||
if ( pmr.width() != 0 )
|
|
||||||
scale_w = ( float )pdr.width() / pmr.width();
|
|
||||||
float scale_h = 0;
|
|
||||||
if ( pmr.height() != 0 )
|
|
||||||
scale_h = ( float )pdr.height() / pmr.height();
|
|
||||||
|
|
||||||
return QRect( pdr.left() + ROUND( ( pr.left() - pmr.left() ) * scale_w ),
|
|
||||||
pdr.top() + ROUND( ( pr.top() - pmr.top() ) * scale_h ),
|
|
||||||
ROUND( ( pr.width() * scale_w ) ),
|
|
||||||
ROUND( ( pr.height() * scale_h ) ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
// default behaves like an mrow
|
|
||||||
|
|
||||||
// now lay them out in a neat row, aligning their origins to my origin
|
|
||||||
int w = 0;
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
{
|
|
||||||
child->setRelOrigin( QPoint( w, 0 ) );
|
|
||||||
w += child->parentRect().width() + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::paint( QPainter *p )
|
|
||||||
{
|
|
||||||
if ( !myRect().isValid() )
|
|
||||||
return;
|
|
||||||
p->save();
|
|
||||||
|
|
||||||
QColor fg = color();
|
|
||||||
QColor bg = background();
|
|
||||||
if ( bg.isValid() )
|
|
||||||
p->fillRect( myRect(), bg );
|
|
||||||
if ( fg.isValid() )
|
|
||||||
p->setPen( QPen( color(), 0 ) );
|
|
||||||
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
child->paint( p );
|
|
||||||
|
|
||||||
paintSymbol( p );
|
|
||||||
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::paintSymbol( QPainter *p ) const
|
|
||||||
{
|
|
||||||
if ( g_draw_frames && myRect().isValid() )
|
|
||||||
{
|
|
||||||
p->save();
|
|
||||||
p->setPen( QPen( Qt::red, 0 ) );
|
|
||||||
p->drawRect( m_my_rect );
|
|
||||||
QPen pen = p->pen();
|
|
||||||
pen.setStyle( Qt::DotLine );
|
|
||||||
p->setPen( pen );
|
|
||||||
p->drawLine( myRect().left(), 0, myRect().right(), 0 );
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlNode::stretch()
|
|
||||||
{
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
child->stretch();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlTokenNode::text() const
|
|
||||||
{
|
|
||||||
QString result;
|
|
||||||
|
|
||||||
const QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
{
|
|
||||||
if ( child->nodeType() != TextNode ) continue;
|
|
||||||
if ( !result.isEmpty() )
|
|
||||||
result += ' ';
|
|
||||||
result += static_cast<const QwtMmlTextNode *>( child )->text();
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlMfracNode::numerator() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *node = firstChild();
|
|
||||||
Q_ASSERT( node != 0 );
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlMfracNode::denominator() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *node = numerator()->nextSibling();
|
|
||||||
Q_ASSERT( node != 0 );
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect QwtMmlMfracNode::symbolRect() const
|
|
||||||
{
|
|
||||||
int num_width = numerator()->myRect().width();
|
|
||||||
int denom_width = denominator()->myRect().width();
|
|
||||||
int my_width = qMax( num_width, denom_width ) + 4;
|
|
||||||
|
|
||||||
return QRect( -my_width / 2, 0, my_width, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMfracNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *num = numerator();
|
|
||||||
QwtMmlNode *denom = denominator();
|
|
||||||
|
|
||||||
QRect num_rect = num->myRect();
|
|
||||||
QRect denom_rect = denom->myRect();
|
|
||||||
|
|
||||||
int spacing = ( int )( g_mfrac_spacing * ( num_rect.height() + denom_rect.height() ) );
|
|
||||||
|
|
||||||
num->setRelOrigin( QPoint( -num_rect.width() / 2, - spacing - num_rect.bottom() ) );
|
|
||||||
denom->setRelOrigin( QPoint( -denom_rect.width() / 2, spacing - denom_rect.top() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool zeroLineThickness( const QString &s )
|
|
||||||
{
|
|
||||||
if ( s.length() == 0 || !s[0].isDigit() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for ( int i = 0; i < s.length(); ++i )
|
|
||||||
{
|
|
||||||
QChar c = s.at( i );
|
|
||||||
if ( c.isDigit() && c != '0' )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMfracNode::paintSymbol( QPainter *p ) const
|
|
||||||
{
|
|
||||||
QString linethickness_str = inheritAttributeFromMrow( "linethickness", "1" );
|
|
||||||
|
|
||||||
/* InterpretSpacing returns an int, which might be 0 even if the thickness
|
|
||||||
is > 0, though very very small. That's ok, because the painter then paints
|
|
||||||
a line of thickness 1. However, we have to run this check if the line
|
|
||||||
thickness really is zero */
|
|
||||||
if ( !zeroLineThickness( linethickness_str ) )
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
int linethickness = interpretSpacing( linethickness_str, &ok );
|
|
||||||
if ( !ok )
|
|
||||||
linethickness = 1;
|
|
||||||
|
|
||||||
p->save();
|
|
||||||
QPen pen = p->pen();
|
|
||||||
pen.setWidth( linethickness );
|
|
||||||
p->setPen( pen );
|
|
||||||
QSize s = myRect().size();
|
|
||||||
p->drawLine( -s.width() / 2, 0, s.width() / 2, 0 );
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlRootBaseNode::base() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *node = firstChild();
|
|
||||||
// Q_ASSERT(node != 0);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlRootBaseNode::index() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
if ( b == 0 )
|
|
||||||
return 0;
|
|
||||||
return b->nextSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlRootBaseNode::scriptlevel( const QwtMmlNode *child ) const
|
|
||||||
{
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
|
|
||||||
QwtMmlNode *i = index();
|
|
||||||
if ( child != 0 && child == i )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QRect QwtMmlRootBaseNode::symbolRect() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
QRect base_rect;
|
|
||||||
if ( b == 0 )
|
|
||||||
base_rect = QRect( 0, 0, 1, 1 );
|
|
||||||
else
|
|
||||||
base_rect = base()->myRect();
|
|
||||||
|
|
||||||
int margin = ( int )( g_mroot_base_margin * base_rect.height() );
|
|
||||||
int tw = tailWidth();
|
|
||||||
|
|
||||||
return QRect( -tw, base_rect.top() - margin, tw,
|
|
||||||
base_rect.height() + 2 * margin );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlRootBaseNode::tailWidth() const
|
|
||||||
{
|
|
||||||
QFontMetrics fm( font() );
|
|
||||||
return fm.boundingRect( g_radical_char ).width();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlRootBaseNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
QSize base_size;
|
|
||||||
if ( b != 0 )
|
|
||||||
{
|
|
||||||
b->setRelOrigin( QPoint( 0, 0 ) );
|
|
||||||
base_size = base()->myRect().size();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
base_size = QSize( 1, 1 );
|
|
||||||
|
|
||||||
QwtMmlNode *i = index();
|
|
||||||
if ( i != 0 )
|
|
||||||
{
|
|
||||||
int tw = tailWidth();
|
|
||||||
|
|
||||||
QRect i_rect = i->myRect();
|
|
||||||
i->setRelOrigin( QPoint( -tw / 2 - i_rect.width(),
|
|
||||||
-i_rect.bottom() - 4 ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlRootBaseNode::paintSymbol( QPainter *p ) const
|
|
||||||
{
|
|
||||||
QFont fn = font();
|
|
||||||
|
|
||||||
p->save();
|
|
||||||
|
|
||||||
QRect sr = symbolRect();
|
|
||||||
|
|
||||||
QRect r = sr;
|
|
||||||
r.moveTopLeft( devicePoint( sr.topLeft() ) );
|
|
||||||
p->setViewport( r );
|
|
||||||
p->setWindow( QFontMetrics( fn ).boundingRect( g_radical_char ) );
|
|
||||||
p->setFont( font() );
|
|
||||||
p->drawText( 0, 0, QString( g_radical_char ) );
|
|
||||||
|
|
||||||
p->restore();
|
|
||||||
|
|
||||||
p->drawLine( sr.right(), sr.top(), myRect().right(), sr.top() );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlTextNode::QwtMmlTextNode( const QString &text, QwtMmlDocument *document )
|
|
||||||
: QwtMmlNode( TextNode, document, QwtMmlAttributeMap() )
|
|
||||||
{
|
|
||||||
m_text = text;
|
|
||||||
// Trim whitespace from ends, but keep nbsp and thinsp
|
|
||||||
m_text.remove( QRegExp( "^[^\\S\\x00a0\\x2009]+" ) );
|
|
||||||
m_text.remove( QRegExp( "[^\\S\\x00a0\\x2009]+$" ) );
|
|
||||||
|
|
||||||
if ( m_text == QString( QChar( 0x62, 0x20 ) ) // ⁢
|
|
||||||
|| m_text == QString( QChar( 0x63, 0x20 ) ) // ⁣
|
|
||||||
|| m_text == QString( QChar( 0x61, 0x20 ) ) ) // ⁡
|
|
||||||
m_text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlTextNode::toStr() const
|
|
||||||
{
|
|
||||||
return QwtMmlNode::toStr() + ", text=\"" + m_text + "\"";
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlTextNode::paintSymbol( QPainter *p ) const
|
|
||||||
{
|
|
||||||
QwtMmlNode::paintSymbol( p );
|
|
||||||
|
|
||||||
QFont fn = font();
|
|
||||||
|
|
||||||
QFontInfo fi( fn );
|
|
||||||
// qWarning("MmlTextNode::paintSymbol(): requested: %s, used: %s, size=%d, italic=%d, bold=%d, text=\"%s\" sl=%d",
|
|
||||||
// fn.family().latin1(), fi.family().latin1(), fi.pointSize(), (int)fi.italic(), (int)fi.bold(), m_text.latin1(), scriptlevel());
|
|
||||||
|
|
||||||
QFontMetrics fm( fn );
|
|
||||||
|
|
||||||
p->save();
|
|
||||||
p->setFont( fn );
|
|
||||||
|
|
||||||
QPoint dPos = devicePoint( relOrigin() );
|
|
||||||
p->drawText( dPos.x(), dPos.y() + fm.strikeOutPos(), m_text );
|
|
||||||
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect QwtMmlTextNode::symbolRect() const
|
|
||||||
{
|
|
||||||
QFontMetrics fm( font() );
|
|
||||||
|
|
||||||
QRect br = fm.tightBoundingRect( m_text );
|
|
||||||
br.translate( 0, fm.strikeOutPos() );
|
|
||||||
|
|
||||||
return br;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlSubsupBaseNode::base() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = firstChild();
|
|
||||||
Q_ASSERT( b != 0 );
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlSubsupBaseNode::sscript() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *s = base()->nextSibling();
|
|
||||||
Q_ASSERT( s != 0 );
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlSubsupBaseNode::scriptlevel( const QwtMmlNode *child ) const
|
|
||||||
{
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
|
|
||||||
QwtMmlNode *s = sscript();
|
|
||||||
if ( child != 0 && child == s )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMsupNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
QwtMmlNode *s = sscript();
|
|
||||||
|
|
||||||
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
||||||
s->setRelOrigin( QPoint( 0, b->myRect().top() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMsubNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
QwtMmlNode *s = sscript();
|
|
||||||
|
|
||||||
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
||||||
s->setRelOrigin( QPoint( 0, b->myRect().bottom() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlMsubsupNode::base() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = firstChild();
|
|
||||||
Q_ASSERT( b != 0 );
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlMsubsupNode::subscript() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *sub = base()->nextSibling();
|
|
||||||
Q_ASSERT( sub != 0 );
|
|
||||||
return sub;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlNode *QwtMmlMsubsupNode::superscript() const
|
|
||||||
{
|
|
||||||
QwtMmlNode *sup = subscript()->nextSibling();
|
|
||||||
Q_ASSERT( sup != 0 );
|
|
||||||
return sup;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMsubsupNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *b = base();
|
|
||||||
QwtMmlNode *sub = subscript();
|
|
||||||
QwtMmlNode *sup = superscript();
|
|
||||||
|
|
||||||
b->setRelOrigin( QPoint( -b->myRect().width(), 0 ) );
|
|
||||||
sub->setRelOrigin( QPoint( 0, b->myRect().bottom() ) );
|
|
||||||
sup->setRelOrigin( QPoint( 0, b->myRect().top() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMsubsupNode::scriptlevel( const QwtMmlNode *child ) const
|
|
||||||
{
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
|
|
||||||
QwtMmlNode *sub = subscript();
|
|
||||||
QwtMmlNode *sup = superscript();
|
|
||||||
|
|
||||||
if ( child != 0 && ( child == sup || child == sub ) )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlMoNode::toStr() const
|
|
||||||
{
|
|
||||||
return QwtMmlNode::toStr() + QString( " form=%1" ).arg( ( int )form() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMoNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
if ( child == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
child->setRelOrigin( QPoint( 0, 0 ) );
|
|
||||||
|
|
||||||
if ( m_oper_spec == 0 )
|
|
||||||
m_oper_spec = mmlFindOperSpec( text(), form() );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlMoNode::QwtMmlMoNode( QwtMmlDocument *document, const QwtMmlAttributeMap &attribute_map )
|
|
||||||
: QwtMmlTokenNode( MoNode, document, attribute_map )
|
|
||||||
{
|
|
||||||
m_oper_spec = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString QwtMmlMoNode::dictionaryAttribute( const QString &name ) const
|
|
||||||
{
|
|
||||||
const QwtMmlNode *p = this;
|
|
||||||
for ( ; p != 0; p = p->parent() )
|
|
||||||
{
|
|
||||||
if ( p == this || p->nodeType() == MstyleNode )
|
|
||||||
{
|
|
||||||
QString expl_attr = p->explicitAttribute( name );
|
|
||||||
if ( !expl_attr.isNull() )
|
|
||||||
return expl_attr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mmlDictAttribute( name, m_oper_spec );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMml::FormType QwtMmlMoNode::form() const
|
|
||||||
{
|
|
||||||
QString value_str = inheritAttributeFromMrow( "form" );
|
|
||||||
if ( !value_str.isNull() )
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
FormType value = interpretForm( value_str, &ok );
|
|
||||||
if ( ok )
|
|
||||||
return value;
|
|
||||||
else
|
|
||||||
qWarning( "Could not convert %s to form", value_str.toLatin1().data() );
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default heuristic.
|
|
||||||
if ( firstSibling() == ( QwtMmlNode* )this && lastSibling() != ( QwtMmlNode* )this )
|
|
||||||
return PrefixForm;
|
|
||||||
else if ( lastSibling() == ( QwtMmlNode* )this && firstSibling() != ( QwtMmlNode* )this )
|
|
||||||
return PostfixForm;
|
|
||||||
else return InfixForm;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMoNode::stretch()
|
|
||||||
{
|
|
||||||
if ( parent() == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ( m_oper_spec == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ( m_oper_spec->stretch_dir == QwtMmlOperSpec::HStretch
|
|
||||||
&& parent()->nodeType() == MrowNode
|
|
||||||
&& ( nextSibling() != 0 || previousSibling() != 0 ) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
QRect pmr = parent()->myRect();
|
|
||||||
QRect pr = parentRect();
|
|
||||||
|
|
||||||
switch ( m_oper_spec->stretch_dir )
|
|
||||||
{
|
|
||||||
case QwtMmlOperSpec::VStretch:
|
|
||||||
stretchTo( QRect( pr.left(), pmr.top(), pr.width(), pmr.height() ) );
|
|
||||||
break;
|
|
||||||
case QwtMmlOperSpec::HStretch:
|
|
||||||
stretchTo( QRect( pmr.left(), pr.top(), pmr.width(), pr.height() ) );
|
|
||||||
break;
|
|
||||||
case QwtMmlOperSpec::HVStretch:
|
|
||||||
stretchTo( pmr );
|
|
||||||
break;
|
|
||||||
case QwtMmlOperSpec::NoStretch:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMoNode::lspace() const
|
|
||||||
{
|
|
||||||
Q_ASSERT( m_oper_spec != 0 );
|
|
||||||
if ( parent() == 0
|
|
||||||
|| ( parent()->nodeType() != MrowNode
|
|
||||||
&& parent()->nodeType() != MfencedNode
|
|
||||||
&& parent()->nodeType() != UnknownNode )
|
|
||||||
|| ( previousSibling() == 0 && nextSibling() == 0 ) )
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return interpretSpacing( dictionaryAttribute( "lspace" ), 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMoNode::rspace() const
|
|
||||||
{
|
|
||||||
Q_ASSERT( m_oper_spec != 0 );
|
|
||||||
if ( parent() == 0
|
|
||||||
|| ( parent()->nodeType() != MrowNode
|
|
||||||
&& parent()->nodeType() != MfencedNode
|
|
||||||
&& parent()->nodeType() != UnknownNode )
|
|
||||||
|| ( previousSibling() == 0 && nextSibling() == 0 ) )
|
|
||||||
return 0;
|
|
||||||
else
|
|
||||||
return interpretSpacing( dictionaryAttribute( "rspace" ), 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect QwtMmlMoNode::symbolRect() const
|
|
||||||
{
|
|
||||||
const QwtMmlNode *child = firstChild();
|
|
||||||
|
|
||||||
if ( child == 0 )
|
|
||||||
return QRect( 0, 0, 0, 0 );
|
|
||||||
|
|
||||||
QRect cmr = child->myRect();
|
|
||||||
|
|
||||||
return QRect( -lspace(), cmr.top(),
|
|
||||||
cmr.width() + lspace() + rspace(), cmr.height() );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMtableNode::rowspacing() const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "rowspacing" );
|
|
||||||
if ( value.isNull() )
|
|
||||||
return ex();
|
|
||||||
bool ok;
|
|
||||||
int r = interpretSpacing( value, &ok );
|
|
||||||
|
|
||||||
if ( ok )
|
|
||||||
return r;
|
|
||||||
else
|
|
||||||
return ex();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMtableNode::columnspacing() const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "columnspacing" );
|
|
||||||
if ( value.isNull() )
|
|
||||||
return ( int )( 0.8 * em() );
|
|
||||||
bool ok;
|
|
||||||
int r = interpretSpacing( value, &ok );
|
|
||||||
|
|
||||||
if ( ok )
|
|
||||||
return r;
|
|
||||||
else
|
|
||||||
return ( int )( 0.8 * em() );
|
|
||||||
}
|
|
||||||
|
|
||||||
uint QwtMmlMtableNode::CellSizeData::colWidthSum() const
|
|
||||||
{
|
|
||||||
uint w = 0;
|
|
||||||
for ( int i = 0; i < col_widths.count(); ++i )
|
|
||||||
w += col_widths[i];
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint QwtMmlMtableNode::CellSizeData::rowHeightSum() const
|
|
||||||
{
|
|
||||||
uint h = 0;
|
|
||||||
for ( int i = 0; i < row_heights.count(); ++i )
|
|
||||||
h += row_heights[i];
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMtableNode::CellSizeData::init( const QwtMmlNode *first_row )
|
|
||||||
{
|
|
||||||
col_widths.clear();
|
|
||||||
row_heights.clear();
|
|
||||||
|
|
||||||
const QwtMmlNode *mtr = first_row;
|
|
||||||
for ( ; mtr != 0; mtr = mtr->nextSibling() )
|
|
||||||
{
|
|
||||||
|
|
||||||
Q_ASSERT( mtr->nodeType() == MtrNode );
|
|
||||||
|
|
||||||
int col_cnt = 0;
|
|
||||||
const QwtMmlNode *mtd = mtr->firstChild();
|
|
||||||
for ( ; mtd != 0; mtd = mtd->nextSibling(), ++col_cnt )
|
|
||||||
{
|
|
||||||
|
|
||||||
Q_ASSERT( mtd->nodeType() == MtdNode );
|
|
||||||
|
|
||||||
QRect mtdmr = mtd->myRect();
|
|
||||||
|
|
||||||
if ( col_cnt == col_widths.count() )
|
|
||||||
col_widths.append( mtdmr.width() );
|
|
||||||
else
|
|
||||||
col_widths[col_cnt] = qMax( col_widths[col_cnt], mtdmr.width() );
|
|
||||||
}
|
|
||||||
|
|
||||||
row_heights.append( mtr->myRect().height() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMtableNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
// Obtain natural widths of columns
|
|
||||||
m_cell_size_data.init( firstChild() );
|
|
||||||
|
|
||||||
int col_spc = columnspacing();
|
|
||||||
int row_spc = rowspacing();
|
|
||||||
int frame_spc_hor = framespacing_hor();
|
|
||||||
QString columnwidth_attr = explicitAttribute( "columnwidth", "auto" );
|
|
||||||
|
|
||||||
// Is table width set by user? If so, set col_width_sum and never ever change it.
|
|
||||||
int col_width_sum = m_cell_size_data.colWidthSum();
|
|
||||||
bool width_set_by_user = false;
|
|
||||||
QString width_str = explicitAttribute( "width", "auto" );
|
|
||||||
if ( width_str != "auto" )
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
|
|
||||||
int w = interpretSpacing( width_str, &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
col_width_sum = w
|
|
||||||
- col_spc * ( m_cell_size_data.numCols() - 1 )
|
|
||||||
- frame_spc_hor * 2;
|
|
||||||
width_set_by_user = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find out what kind of columns we are dealing with and set the widths of
|
|
||||||
// statically sized columns.
|
|
||||||
int fixed_width_sum = 0; // sum of widths of statically sized set columns
|
|
||||||
int auto_width_sum = 0; // sum of natural widths of auto sized columns
|
|
||||||
int relative_width_sum = 0; // sum of natural widths of relatively sized columns
|
|
||||||
double relative_fraction_sum = 0; // total fraction of width taken by relatively
|
|
||||||
// sized columns
|
|
||||||
int i;
|
|
||||||
for ( i = 0; i < m_cell_size_data.numCols(); ++i )
|
|
||||||
{
|
|
||||||
QString value = interpretListAttr( columnwidth_attr, i, "auto" );
|
|
||||||
|
|
||||||
// Is it an auto sized column?
|
|
||||||
if ( value == "auto" || value == "fit" )
|
|
||||||
{
|
|
||||||
auto_width_sum += m_cell_size_data.col_widths[i];
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is it a statically sized column?
|
|
||||||
bool ok;
|
|
||||||
int w = interpretSpacing( value, &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
// Yup, sets its width to the user specified value
|
|
||||||
m_cell_size_data.col_widths[i] = w;
|
|
||||||
fixed_width_sum += w;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is it a relatively sized column?
|
|
||||||
if ( value.endsWith( "%" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 1 );
|
|
||||||
double factor = value.toFloat( &ok );
|
|
||||||
if ( ok && !value.isEmpty() )
|
|
||||||
{
|
|
||||||
factor /= 100.0;
|
|
||||||
relative_width_sum += m_cell_size_data.col_widths[i];
|
|
||||||
relative_fraction_sum += factor;
|
|
||||||
if ( !width_set_by_user )
|
|
||||||
{
|
|
||||||
// If the table width was not set by the user, we are free to increase
|
|
||||||
// it so that the width of this column will be >= than its natural width
|
|
||||||
int min_col_width_sum = ROUND( m_cell_size_data.col_widths[i] / factor );
|
|
||||||
if ( min_col_width_sum > col_width_sum )
|
|
||||||
col_width_sum = min_col_width_sum;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
qWarning( "MmlMtableNode::layoutSymbol(): could not parse value %s%%", value.toLatin1().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Relatively sized column, but we failed to parse the factor. Treat is like an auto
|
|
||||||
// column.
|
|
||||||
auto_width_sum += m_cell_size_data.col_widths[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Work out how much space remains for the auto olumns, after allocating
|
|
||||||
// the statically sized and the relatively sized columns.
|
|
||||||
int required_auto_width_sum = col_width_sum
|
|
||||||
- ROUND( relative_fraction_sum * col_width_sum )
|
|
||||||
- fixed_width_sum;
|
|
||||||
|
|
||||||
if ( !width_set_by_user && required_auto_width_sum < auto_width_sum )
|
|
||||||
{
|
|
||||||
if ( relative_fraction_sum < 1 )
|
|
||||||
col_width_sum = ROUND( ( fixed_width_sum + auto_width_sum ) / ( 1 - relative_fraction_sum ) );
|
|
||||||
else
|
|
||||||
col_width_sum = fixed_width_sum + auto_width_sum + relative_width_sum;
|
|
||||||
required_auto_width_sum = auto_width_sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ratio by which we have to shring/grow all auto sized columns to make it all fit
|
|
||||||
double auto_width_scale = 1;
|
|
||||||
if ( auto_width_sum > 0 )
|
|
||||||
auto_width_scale = ( float )required_auto_width_sum / auto_width_sum;
|
|
||||||
|
|
||||||
// Set correct sizes for the auto sized and the relatively sized columns.
|
|
||||||
for ( i = 0; i < m_cell_size_data.numCols(); ++i )
|
|
||||||
{
|
|
||||||
QString value = interpretListAttr( columnwidth_attr, i, "auto" );
|
|
||||||
|
|
||||||
// Is it a relatively sized column?
|
|
||||||
if ( value.endsWith( "%" ) )
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
int w = interpretPercentSpacing( value, col_width_sum, &ok );
|
|
||||||
if ( ok )
|
|
||||||
m_cell_size_data.col_widths[i] = w;
|
|
||||||
else
|
|
||||||
// We're treating parsing errors here as auto sized columns
|
|
||||||
m_cell_size_data.col_widths[i]
|
|
||||||
= ROUND( auto_width_scale * m_cell_size_data.col_widths[i] );
|
|
||||||
}
|
|
||||||
// Is it an auto sized column?
|
|
||||||
else if ( value == "auto" )
|
|
||||||
{
|
|
||||||
m_cell_size_data.col_widths[i]
|
|
||||||
= ROUND( auto_width_scale * m_cell_size_data.col_widths[i] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString s;
|
|
||||||
QList<int> &col_widths = m_cell_size_data.col_widths;
|
|
||||||
for ( i = 0; i < col_widths.count(); ++i )
|
|
||||||
{
|
|
||||||
s += QString( "[w=%1 %2%%]" )
|
|
||||||
.arg( col_widths[i] )
|
|
||||||
.arg( 100 * col_widths[i] / m_cell_size_data.colWidthSum() );
|
|
||||||
}
|
|
||||||
// qWarning(s);
|
|
||||||
|
|
||||||
m_content_width = m_cell_size_data.colWidthSum()
|
|
||||||
+ col_spc * ( m_cell_size_data.numCols() - 1 );
|
|
||||||
m_content_height = m_cell_size_data.rowHeightSum()
|
|
||||||
+ row_spc * ( m_cell_size_data.numRows() - 1 );
|
|
||||||
|
|
||||||
int bottom = -m_content_height / 2;
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
for ( ; child != 0; child = child->nextSibling() )
|
|
||||||
{
|
|
||||||
Q_ASSERT( child->nodeType() == MtrNode );
|
|
||||||
QwtMmlMtrNode *row = ( QwtMmlMtrNode* ) child;
|
|
||||||
|
|
||||||
row->layoutCells( m_cell_size_data.col_widths, col_spc );
|
|
||||||
QRect rmr = row->myRect();
|
|
||||||
row->setRelOrigin( QPoint( 0, bottom - rmr.top() ) );
|
|
||||||
bottom += rmr.height() + row_spc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect QwtMmlMtableNode::symbolRect() const
|
|
||||||
{
|
|
||||||
int frame_spc_hor = framespacing_hor();
|
|
||||||
int frame_spc_ver = framespacing_ver();
|
|
||||||
|
|
||||||
return QRect( -frame_spc_hor,
|
|
||||||
-m_content_height / 2 - frame_spc_ver,
|
|
||||||
m_content_width + 2 * frame_spc_hor,
|
|
||||||
m_content_height + 2 * frame_spc_ver );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMml::FrameType QwtMmlMtableNode::frame() const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "frame", "none" );
|
|
||||||
return interpretFrameType( value, 0, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMml::FrameType QwtMmlMtableNode::columnlines( int idx ) const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "columnlines", "none" );
|
|
||||||
return interpretFrameType( value, idx, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMml::FrameType QwtMmlMtableNode::rowlines( int idx ) const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "rowlines", "none" );
|
|
||||||
return interpretFrameType( value, idx, 0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMtableNode::paintSymbol( QPainter *p ) const
|
|
||||||
{
|
|
||||||
FrameType f = frame();
|
|
||||||
if ( f != FrameNone )
|
|
||||||
{
|
|
||||||
p->save();
|
|
||||||
|
|
||||||
QPen pen = p->pen();
|
|
||||||
if ( f == FrameDashed )
|
|
||||||
pen.setStyle( Qt::DashLine );
|
|
||||||
else
|
|
||||||
pen.setStyle( Qt::SolidLine );
|
|
||||||
p->setPen( pen );
|
|
||||||
p->drawRect( myRect() );
|
|
||||||
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
p->save();
|
|
||||||
|
|
||||||
int col_spc = columnspacing();
|
|
||||||
int row_spc = rowspacing();
|
|
||||||
|
|
||||||
QPen pen = p->pen();
|
|
||||||
int col_offset = 0;
|
|
||||||
int i;
|
|
||||||
for ( i = 0; i < m_cell_size_data.numCols() - 1; ++i )
|
|
||||||
{
|
|
||||||
FrameType f = columnlines( i );
|
|
||||||
col_offset += m_cell_size_data.col_widths[i];
|
|
||||||
|
|
||||||
if ( f != FrameNone )
|
|
||||||
{
|
|
||||||
if ( f == FrameDashed )
|
|
||||||
pen.setStyle( Qt::DashLine );
|
|
||||||
else if ( f == FrameSolid )
|
|
||||||
pen.setStyle( Qt::SolidLine );
|
|
||||||
|
|
||||||
p->setPen( pen );
|
|
||||||
int x = col_offset + col_spc / 2;
|
|
||||||
p->drawLine( x, -m_content_height / 2, x, m_content_height / 2 );
|
|
||||||
}
|
|
||||||
col_offset += col_spc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int row_offset = 0;
|
|
||||||
for ( i = 0; i < m_cell_size_data.numRows() - 1; ++i )
|
|
||||||
{
|
|
||||||
FrameType f = rowlines( i );
|
|
||||||
row_offset += m_cell_size_data.row_heights[i];
|
|
||||||
|
|
||||||
if ( f != FrameNone )
|
|
||||||
{
|
|
||||||
if ( f == FrameDashed )
|
|
||||||
pen.setStyle( Qt::DashLine );
|
|
||||||
else if ( f == FrameSolid )
|
|
||||||
pen.setStyle( Qt::SolidLine );
|
|
||||||
|
|
||||||
p->setPen( pen );
|
|
||||||
int y = row_offset + row_spc / 2 - m_content_height / 2;
|
|
||||||
p->drawLine( 0, y, m_content_width, y );
|
|
||||||
}
|
|
||||||
row_offset += row_spc;
|
|
||||||
}
|
|
||||||
|
|
||||||
p->restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMtableNode::framespacing_ver() const
|
|
||||||
{
|
|
||||||
if ( frame() == FrameNone )
|
|
||||||
return ( int )( 0.2 * em() );
|
|
||||||
|
|
||||||
QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" );
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok );
|
|
||||||
if ( ok )
|
|
||||||
return fs.m_ver;
|
|
||||||
else
|
|
||||||
return ( int )( 0.5 * ex() );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMtableNode::framespacing_hor() const
|
|
||||||
{
|
|
||||||
if ( frame() == FrameNone )
|
|
||||||
return ( int )( 0.2 * em() );
|
|
||||||
|
|
||||||
QString value = explicitAttribute( "framespacing", "0.4em 0.5ex" );
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
FrameSpacing fs = interpretFrameSpacing( value, em(), ex(), &ok );
|
|
||||||
if ( ok )
|
|
||||||
return fs.m_hor;
|
|
||||||
else
|
|
||||||
return ( int )( 0.4 * em() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMtrNode::layoutCells( const QList<int> &col_widths,
|
|
||||||
int col_spc )
|
|
||||||
{
|
|
||||||
QRect mr = myRect();
|
|
||||||
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
int col_offset = 0;
|
|
||||||
uint colnum = 0;
|
|
||||||
for ( ; child != 0; child = child->nextSibling(), ++colnum )
|
|
||||||
{
|
|
||||||
Q_ASSERT( child->nodeType() == MtdNode );
|
|
||||||
QwtMmlMtdNode *mtd = ( QwtMmlMtdNode* ) child;
|
|
||||||
|
|
||||||
QRect r = QRect( 0, mr.top(), col_widths[colnum], mr.height() );
|
|
||||||
mtd->setMyRect( r );
|
|
||||||
mtd->setRelOrigin( QPoint( col_offset, 0 ) );
|
|
||||||
col_offset += col_widths[colnum] + col_spc;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateMyRect();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMtdNode::scriptlevel( const QwtMmlNode *child ) const
|
|
||||||
{
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
if ( child != 0 && child == firstChild() )
|
|
||||||
return sl + m_scriptlevel_adjust;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMtdNode::setMyRect( const QRect &rect )
|
|
||||||
{
|
|
||||||
QwtMmlNode::setMyRect( rect );
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
if ( child == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ( rect.width() < child->myRect().width() )
|
|
||||||
{
|
|
||||||
while ( rect.width() < child->myRect().width()
|
|
||||||
&& child->font().pointSize() > g_min_font_point_size )
|
|
||||||
{
|
|
||||||
|
|
||||||
// qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d",
|
|
||||||
// rect.width(), child->myRect().width(), m_scriptlevel_adjust);
|
|
||||||
|
|
||||||
++m_scriptlevel_adjust;
|
|
||||||
child->layout();
|
|
||||||
}
|
|
||||||
|
|
||||||
// qWarning("MmlMtdNode::setMyRect(): rect.width()=%d, child()->myRect().width=%d sl=%d",
|
|
||||||
// rect.width(), child->myRect().width(), m_scriptlevel_adjust);
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect mr = myRect();
|
|
||||||
QRect cmr = child->myRect();
|
|
||||||
|
|
||||||
QPoint child_rel_origin;
|
|
||||||
|
|
||||||
switch ( columnalign() )
|
|
||||||
{
|
|
||||||
case ColAlignLeft:
|
|
||||||
child_rel_origin.setX( 0 );
|
|
||||||
break;
|
|
||||||
case ColAlignCenter:
|
|
||||||
child_rel_origin.setX( mr.left() + ( mr.width() - cmr.width() ) / 2 );
|
|
||||||
break;
|
|
||||||
case ColAlignRight:
|
|
||||||
child_rel_origin.setX( mr.right() - cmr.width() );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch ( rowalign() )
|
|
||||||
{
|
|
||||||
case RowAlignTop:
|
|
||||||
child_rel_origin.setY( mr.top() - cmr.top() );
|
|
||||||
break;
|
|
||||||
case RowAlignCenter:
|
|
||||||
case RowAlignBaseline:
|
|
||||||
child_rel_origin.setY( mr.top() - cmr.top() + ( mr.height() - cmr.height() ) / 2 );
|
|
||||||
break;
|
|
||||||
case RowAlignBottom:
|
|
||||||
child_rel_origin.setY( mr.bottom() - cmr.bottom() );
|
|
||||||
break;
|
|
||||||
case RowAlignAxis:
|
|
||||||
child_rel_origin.setY( 0 );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
child->setRelOrigin( child_rel_origin );
|
|
||||||
}
|
|
||||||
|
|
||||||
uint QwtMmlMtdNode::colNum()
|
|
||||||
{
|
|
||||||
QwtMmlNode *syb = previousSibling();
|
|
||||||
|
|
||||||
uint i = 0;
|
|
||||||
for ( ; syb != 0; syb = syb->previousSibling() )
|
|
||||||
++i;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint QwtMmlMtdNode::rowNum()
|
|
||||||
{
|
|
||||||
QwtMmlNode *row = parent()->previousSibling();
|
|
||||||
|
|
||||||
uint i = 0;
|
|
||||||
for ( ; row != 0; row = row->previousSibling() )
|
|
||||||
++i;
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlMtdNode::ColAlign QwtMmlMtdNode::columnalign()
|
|
||||||
{
|
|
||||||
QString val = explicitAttribute( "columnalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretColAlign( val, 0, 0 );
|
|
||||||
|
|
||||||
QwtMmlNode *node = parent(); // <mtr>
|
|
||||||
if ( node == 0 )
|
|
||||||
return ColAlignCenter;
|
|
||||||
|
|
||||||
uint colnum = colNum();
|
|
||||||
val = node->explicitAttribute( "columnalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretColAlign( val, colnum, 0 );
|
|
||||||
|
|
||||||
node = node->parent(); // <mtable>
|
|
||||||
if ( node == 0 )
|
|
||||||
return ColAlignCenter;
|
|
||||||
|
|
||||||
val = node->explicitAttribute( "columnalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretColAlign( val, colnum, 0 );
|
|
||||||
|
|
||||||
return ColAlignCenter;
|
|
||||||
}
|
|
||||||
|
|
||||||
QwtMmlMtdNode::RowAlign QwtMmlMtdNode::rowalign()
|
|
||||||
{
|
|
||||||
QString val = explicitAttribute( "rowalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretRowAlign( val, 0, 0 );
|
|
||||||
|
|
||||||
QwtMmlNode *node = parent(); // <mtr>
|
|
||||||
if ( node == 0 )
|
|
||||||
return RowAlignAxis;
|
|
||||||
|
|
||||||
uint rownum = rowNum();
|
|
||||||
val = node->explicitAttribute( "rowalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretRowAlign( val, rownum, 0 );
|
|
||||||
|
|
||||||
node = node->parent(); // <mtable>
|
|
||||||
if ( node == 0 )
|
|
||||||
return RowAlignAxis;
|
|
||||||
|
|
||||||
val = node->explicitAttribute( "rowalign" );
|
|
||||||
if ( !val.isNull() )
|
|
||||||
return interpretRowAlign( val, rownum, 0 );
|
|
||||||
|
|
||||||
return RowAlignAxis;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMoverNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *over = base->nextSibling();
|
|
||||||
Q_ASSERT( over != 0 );
|
|
||||||
|
|
||||||
QRect base_rect = base->myRect();
|
|
||||||
QRect over_rect = over->myRect();
|
|
||||||
|
|
||||||
int spacing = ( int )( g_mfrac_spacing * ( over_rect.height()
|
|
||||||
+ base_rect.height() ) );
|
|
||||||
|
|
||||||
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
||||||
over->setRelOrigin( QPoint( -over_rect.width() / 2,
|
|
||||||
base_rect.top() - spacing - over_rect.bottom() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMoverNode::scriptlevel( const QwtMmlNode *node ) const
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *over = base->nextSibling();
|
|
||||||
Q_ASSERT( over != 0 );
|
|
||||||
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
if ( node != 0 && node == over )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMunderNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *under = base->nextSibling();
|
|
||||||
Q_ASSERT( under != 0 );
|
|
||||||
|
|
||||||
QRect base_rect = base->myRect();
|
|
||||||
QRect under_rect = under->myRect();
|
|
||||||
|
|
||||||
int spacing = ( int )( g_mfrac_spacing * ( under_rect.height() + base_rect.height() ) );
|
|
||||||
|
|
||||||
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
||||||
under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMunderNode::scriptlevel( const QwtMmlNode *node ) const
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *under = base->nextSibling();
|
|
||||||
Q_ASSERT( under != 0 );
|
|
||||||
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
if ( node != 0 && node == under )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMunderoverNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *under = base->nextSibling();
|
|
||||||
Q_ASSERT( under != 0 );
|
|
||||||
QwtMmlNode *over = under->nextSibling();
|
|
||||||
Q_ASSERT( over != 0 );
|
|
||||||
|
|
||||||
QRect base_rect = base->myRect();
|
|
||||||
QRect under_rect = under->myRect();
|
|
||||||
QRect over_rect = over->myRect();
|
|
||||||
|
|
||||||
int spacing = ( int )( g_mfrac_spacing * ( base_rect.height()
|
|
||||||
+ under_rect.height()
|
|
||||||
+ over_rect.height() ) );
|
|
||||||
|
|
||||||
base->setRelOrigin( QPoint( -base_rect.width() / 2, 0 ) );
|
|
||||||
under->setRelOrigin( QPoint( -under_rect.width() / 2, base_rect.bottom() + spacing - under_rect.top() ) );
|
|
||||||
over->setRelOrigin( QPoint( -over_rect.width() / 2, base_rect.top() - spacing - under_rect.bottom() ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMunderoverNode::scriptlevel( const QwtMmlNode *node ) const
|
|
||||||
{
|
|
||||||
QwtMmlNode *base = firstChild();
|
|
||||||
Q_ASSERT( base != 0 );
|
|
||||||
QwtMmlNode *under = base->nextSibling();
|
|
||||||
Q_ASSERT( under != 0 );
|
|
||||||
QwtMmlNode *over = under->nextSibling();
|
|
||||||
Q_ASSERT( over != 0 );
|
|
||||||
|
|
||||||
int sl = QwtMmlNode::scriptlevel();
|
|
||||||
if ( node != 0 && ( node == under || node == over ) )
|
|
||||||
return sl + 1;
|
|
||||||
else
|
|
||||||
return sl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMpaddedNode::interpretSpacing( QString value, int base_value, bool *ok ) const
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
value.replace( ' ', "" );
|
|
||||||
|
|
||||||
QString sign, factor_str, pseudo_unit;
|
|
||||||
bool percent = false;
|
|
||||||
|
|
||||||
// extract the sign
|
|
||||||
int idx = 0;
|
|
||||||
if ( idx < value.length() && ( value.at( idx ) == '+' || value.at( idx ) == '-' ) )
|
|
||||||
sign = value.at( idx++ );
|
|
||||||
|
|
||||||
// extract the factor
|
|
||||||
while ( idx < value.length() && ( value.at( idx ).isDigit() || value.at( idx ) == '.' ) )
|
|
||||||
factor_str.append( value.at( idx++ ) );
|
|
||||||
|
|
||||||
// extract the % sign
|
|
||||||
if ( idx < value.length() && value.at( idx ) == '%' )
|
|
||||||
{
|
|
||||||
percent = true;
|
|
||||||
++idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
// extract the pseudo-unit
|
|
||||||
pseudo_unit = value.mid( idx );
|
|
||||||
|
|
||||||
bool float_ok;
|
|
||||||
double factor = factor_str.toFloat( &float_ok );
|
|
||||||
if ( !float_ok || factor < 0 )
|
|
||||||
{
|
|
||||||
qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( percent )
|
|
||||||
factor /= 100.0;
|
|
||||||
|
|
||||||
QRect cr;
|
|
||||||
if ( firstChild() == 0 )
|
|
||||||
cr = QRect( 0, 0, 0, 0 );
|
|
||||||
else
|
|
||||||
cr = firstChild()->myRect();
|
|
||||||
|
|
||||||
int unit_size;
|
|
||||||
|
|
||||||
if ( pseudo_unit.isEmpty() )
|
|
||||||
unit_size = base_value;
|
|
||||||
else if ( pseudo_unit == "width" )
|
|
||||||
unit_size = cr.width();
|
|
||||||
else if ( pseudo_unit == "height" )
|
|
||||||
unit_size = -cr.top();
|
|
||||||
else if ( pseudo_unit == "depth" )
|
|
||||||
unit_size = cr.bottom();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool unit_ok;
|
|
||||||
unit_size = QwtMmlNode::interpretSpacing( "1" + pseudo_unit, &unit_ok );
|
|
||||||
if ( !unit_ok )
|
|
||||||
{
|
|
||||||
qWarning( "MmlMpaddedNode::interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( sign.isNull() )
|
|
||||||
return ( int )( factor * unit_size );
|
|
||||||
else if ( sign == "+" )
|
|
||||||
return base_value + ( int )( factor * unit_size );
|
|
||||||
else // sign == "-"
|
|
||||||
return base_value - ( int )( factor * unit_size );
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMpaddedNode::lspace() const
|
|
||||||
{
|
|
||||||
QString value = explicitAttribute( "lspace" );
|
|
||||||
|
|
||||||
if ( value.isNull() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int lspace = interpretSpacing( value, 0, &ok );
|
|
||||||
|
|
||||||
if ( ok )
|
|
||||||
return lspace;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMpaddedNode::width() const
|
|
||||||
{
|
|
||||||
int child_width = 0;
|
|
||||||
if ( firstChild() != 0 )
|
|
||||||
child_width = firstChild()->myRect().width();
|
|
||||||
|
|
||||||
QString value = explicitAttribute( "width" );
|
|
||||||
if ( value.isNull() )
|
|
||||||
return child_width;
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int w = interpretSpacing( value, child_width, &ok );
|
|
||||||
if ( ok )
|
|
||||||
return w;
|
|
||||||
|
|
||||||
return child_width;
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMpaddedNode::height() const
|
|
||||||
{
|
|
||||||
QRect cr;
|
|
||||||
if ( firstChild() == 0 )
|
|
||||||
cr = QRect( 0, 0, 0, 0 );
|
|
||||||
else
|
|
||||||
cr = firstChild()->myRect();
|
|
||||||
|
|
||||||
QString value = explicitAttribute( "height" );
|
|
||||||
if ( value.isNull() )
|
|
||||||
return -cr.top();
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int h = interpretSpacing( value, -cr.top(), &ok );
|
|
||||||
if ( ok )
|
|
||||||
return h;
|
|
||||||
|
|
||||||
return -cr.top();
|
|
||||||
}
|
|
||||||
|
|
||||||
int QwtMmlMpaddedNode::depth() const
|
|
||||||
{
|
|
||||||
QRect cr;
|
|
||||||
if ( firstChild() == 0 )
|
|
||||||
cr = QRect( 0, 0, 0, 0 );
|
|
||||||
else
|
|
||||||
cr = firstChild()->myRect();
|
|
||||||
|
|
||||||
QString value = explicitAttribute( "depth" );
|
|
||||||
if ( value.isNull() )
|
|
||||||
return cr.bottom();
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int h = interpretSpacing( value, cr.bottom(), &ok );
|
|
||||||
if ( ok )
|
|
||||||
return h;
|
|
||||||
|
|
||||||
return cr.bottom();
|
|
||||||
}
|
|
||||||
|
|
||||||
void QwtMmlMpaddedNode::layoutSymbol()
|
|
||||||
{
|
|
||||||
QwtMmlNode *child = firstChild();
|
|
||||||
if ( child == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
child->setRelOrigin( QPoint( 0, 0 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QRect QwtMmlMpaddedNode::symbolRect() const
|
|
||||||
{
|
|
||||||
return QRect( -lspace(), -height(), lspace() + width(), height() + depth() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// *******************************************************************
|
|
||||||
// Static helper functions
|
|
||||||
// *******************************************************************
|
|
||||||
|
|
||||||
static QString entityDeclarations()
|
|
||||||
{
|
|
||||||
QString result = "<!DOCTYPE math [\n";
|
|
||||||
|
|
||||||
const QwtMmlEntitySpec *ent = g_xml_entity_data;
|
|
||||||
for ( ; ent->name != 0; ++ent )
|
|
||||||
{
|
|
||||||
result += "\t<!ENTITY " + QString( ent->name ) + " \"" + ent->value + "\">\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
result += "]>\n";
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int interpretSpacing( QString value, int em, int ex, bool *ok )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( value == "thin" )
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if ( value == "medium" )
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
if ( value == "thick" )
|
|
||||||
return 3;
|
|
||||||
|
|
||||||
struct HSpacingValue
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
float factor;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const HSpacingValue g_h_spacing_data[] =
|
|
||||||
{
|
|
||||||
{ "veryverythinmathspace", ( float ) 0.0555556 },
|
|
||||||
{ "verythinmathspace", ( float ) 0.111111 },
|
|
||||||
{ "thinmathspace", ( float ) 0.166667 },
|
|
||||||
{ "mediummathspace", ( float ) 0.222222 },
|
|
||||||
{ "thickmathspace", ( float ) 0.277778 },
|
|
||||||
{ "verythickmathspace", ( float ) 0.333333 },
|
|
||||||
{ "veryverythickmathspace", ( float ) 0.388889 },
|
|
||||||
{ 0, ( float ) 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const HSpacingValue *v = g_h_spacing_data;
|
|
||||||
for ( ; v->name != 0; ++v )
|
|
||||||
{
|
|
||||||
if ( value == v->name )
|
|
||||||
return ( int )( em * v->factor );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "em" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
return ( int )( em * factor );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%sem\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "ex" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
return ( int )( ex * factor );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%sex\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "cm" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
{
|
|
||||||
Q_ASSERT( qApp->desktop() != 0 );
|
|
||||||
QDesktopWidget *dw = qApp->desktop();
|
|
||||||
Q_ASSERT( dw->width() != 0 );
|
|
||||||
Q_ASSERT( dw->widthMM() != 0 );
|
|
||||||
return ( int )( factor * 10 * dw->width() / dw->widthMM() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%scm\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "mm" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
{
|
|
||||||
Q_ASSERT( qApp->desktop() != 0 );
|
|
||||||
QDesktopWidget *dw = qApp->desktop();
|
|
||||||
Q_ASSERT( dw->width() != 0 );
|
|
||||||
Q_ASSERT( dw->widthMM() != 0 );
|
|
||||||
return ( int )( factor * dw->width() / dw->widthMM() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%smm\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "in" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
{
|
|
||||||
Q_ASSERT( qApp->desktop() != 0 );
|
|
||||||
QDesktopWidget *dw = qApp->desktop();
|
|
||||||
Q_ASSERT( dw->width() != 0 );
|
|
||||||
Q_ASSERT( dw->widthMM() != 0 );
|
|
||||||
return ( int )( factor * 10 * dw->width() / ( 2.54 * dw->widthMM() ) );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%sin\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value.endsWith( "px" ) )
|
|
||||||
{
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
int i = ( int ) value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && i >= 0 )
|
|
||||||
return i;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%spx\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool float_ok;
|
|
||||||
int i = ( int )value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && i >= 0 )
|
|
||||||
return i;
|
|
||||||
|
|
||||||
qWarning( "interpretSpacing(): could not parse \"%s\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int interpretPercentSpacing( QString value, int base, bool *ok )
|
|
||||||
{
|
|
||||||
if ( !value.endsWith( "%" ) )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
value.truncate( value.length() - 1 );
|
|
||||||
bool float_ok;
|
|
||||||
float factor = value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && factor >= 0 )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
return ( int )( base * factor / 100.0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
qWarning( "interpretPercentSpacing(): could not parse \"%s%%\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int interpretPointSize( QString value, bool *ok )
|
|
||||||
{
|
|
||||||
if ( !value.endsWith( "pt" ) )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
value.truncate( value.length() - 2 );
|
|
||||||
bool float_ok;
|
|
||||||
int pt_size = ( int ) value.toFloat( &float_ok );
|
|
||||||
if ( float_ok && pt_size > 0 )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
return pt_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
qWarning( "interpretPointSize(): could not parse \"%spt\"", value.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QwtMmlNodeSpec *mmlFindNodeSpec( QwtMml::NodeType type )
|
|
||||||
{
|
|
||||||
const QwtMmlNodeSpec *spec = g_node_spec_data;
|
|
||||||
for ( ; spec->type != QwtMml::NoNode; ++spec )
|
|
||||||
{
|
|
||||||
if ( type == spec->type ) return spec;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QwtMmlNodeSpec *mmlFindNodeSpec( const QString &tag )
|
|
||||||
{
|
|
||||||
const QwtMmlNodeSpec *spec = g_node_spec_data;
|
|
||||||
for ( ; spec->type != QwtMml::NoNode; ++spec )
|
|
||||||
{
|
|
||||||
if ( tag == spec->tag ) return spec;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mmlCheckChildType( QwtMml::NodeType parent_type, QwtMml::NodeType child_type,
|
|
||||||
QString *error_str )
|
|
||||||
{
|
|
||||||
if ( parent_type == QwtMml::UnknownNode || child_type == QwtMml::UnknownNode )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
const QwtMmlNodeSpec *child_spec = mmlFindNodeSpec( child_type );
|
|
||||||
const QwtMmlNodeSpec *parent_spec = mmlFindNodeSpec( parent_type );
|
|
||||||
|
|
||||||
Q_ASSERT( parent_spec != 0 );
|
|
||||||
Q_ASSERT( child_spec != 0 );
|
|
||||||
|
|
||||||
QString allowed_child_types( parent_spec->child_types );
|
|
||||||
// null list means any child type is valid
|
|
||||||
if ( allowed_child_types.isNull() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
QString child_type_str = QString( " " ) + child_spec->type_str + " ";
|
|
||||||
if ( !allowed_child_types.contains( child_type_str ) )
|
|
||||||
{
|
|
||||||
if ( error_str != 0 )
|
|
||||||
*error_str = QString( "illegal child " )
|
|
||||||
+ child_spec->type_str
|
|
||||||
+ " for parent "
|
|
||||||
+ parent_spec->type_str;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool mmlCheckAttributes( QwtMml::NodeType child_type, const QwtMmlAttributeMap &attr,
|
|
||||||
QString *error_str )
|
|
||||||
{
|
|
||||||
const QwtMmlNodeSpec *spec = mmlFindNodeSpec( child_type );
|
|
||||||
Q_ASSERT( spec != 0 );
|
|
||||||
|
|
||||||
QString allowed_attr( spec->attributes );
|
|
||||||
// empty list means any attr is valid
|
|
||||||
if ( allowed_attr.isEmpty() )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
QwtMmlAttributeMap::const_iterator it = attr.begin(), end = attr.end();
|
|
||||||
for ( ; it != end; ++it )
|
|
||||||
{
|
|
||||||
QString name = it.key();
|
|
||||||
|
|
||||||
if ( name.indexOf( ':' ) != -1 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
QString padded_name = " " + name + " ";
|
|
||||||
if ( !allowed_attr.contains( padded_name ) )
|
|
||||||
{
|
|
||||||
if ( error_str != 0 )
|
|
||||||
*error_str = QString( "illegal attribute " )
|
|
||||||
+ name
|
|
||||||
+ " in "
|
|
||||||
+ spec->type_str;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int attributeIndex( const QString &name )
|
|
||||||
{
|
|
||||||
for ( unsigned i = 0; i < g_oper_spec_rows; ++i )
|
|
||||||
{
|
|
||||||
if ( name == g_oper_spec_names[i] )
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QString decodeEntityValue( QString literal )
|
|
||||||
{
|
|
||||||
QString result;
|
|
||||||
|
|
||||||
while ( !literal.isEmpty() )
|
|
||||||
{
|
|
||||||
|
|
||||||
if ( !literal.startsWith( "&#" ) )
|
|
||||||
{
|
|
||||||
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
literal = literal.right( literal.length() - 2 );
|
|
||||||
|
|
||||||
int i = literal.indexOf( ';' );
|
|
||||||
if ( i == -1 )
|
|
||||||
{
|
|
||||||
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString char_code = literal.left( i );
|
|
||||||
literal = literal.right( literal.length() - i - 1 );
|
|
||||||
|
|
||||||
if ( char_code.isEmpty() )
|
|
||||||
{
|
|
||||||
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( char_code.at( 0 ) == 'x' )
|
|
||||||
{
|
|
||||||
char_code = char_code.right( char_code.length() - 1 );
|
|
||||||
bool ok;
|
|
||||||
unsigned c = char_code.toUInt( &ok, 16 );
|
|
||||||
if ( !ok )
|
|
||||||
{
|
|
||||||
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
result += QChar( c );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool ok;
|
|
||||||
unsigned c = char_code.toUInt( &ok, 10 );
|
|
||||||
if ( !ok )
|
|
||||||
{
|
|
||||||
qWarning() << "decodeEntityValue(): bad entity literal: \"" + literal + "\"";
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
result += QChar( c );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QwtMmlEntitySpec *searchEntitySpecData( const QString &value, const QwtMmlEntitySpec *from = 0 )
|
|
||||||
{
|
|
||||||
const QwtMmlEntitySpec *ent = from;
|
|
||||||
if ( ent == 0 )
|
|
||||||
ent = g_xml_entity_data;
|
|
||||||
for ( ; ent->name != 0; ++ent )
|
|
||||||
{
|
|
||||||
QString ent_value = decodeEntityValue( ent->value );
|
|
||||||
if ( value == ent_value )
|
|
||||||
return ent;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct OperSpecSearchResult
|
|
||||||
{
|
|
||||||
OperSpecSearchResult() { prefix_form = infix_form = postfix_form = 0; }
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *prefix_form,
|
|
||||||
*infix_form,
|
|
||||||
*postfix_form;
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *&getForm( QwtMml::FormType f );
|
|
||||||
bool haveForm( QwtMml::FormType f )
|
|
||||||
{ return getForm( f ) != 0; }
|
|
||||||
void addForm( const QwtMmlOperSpec *spec )
|
|
||||||
{ getForm( spec->form ) = spec; }
|
|
||||||
};
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *&OperSpecSearchResult::getForm( QwtMml::FormType f )
|
|
||||||
{
|
|
||||||
switch ( f )
|
|
||||||
{
|
|
||||||
case QwtMml::PrefixForm:
|
|
||||||
return prefix_form;
|
|
||||||
case QwtMml::InfixForm:
|
|
||||||
return infix_form;
|
|
||||||
case QwtMml::PostfixForm:
|
|
||||||
return postfix_form;
|
|
||||||
}
|
|
||||||
return postfix_form; // just to avoid warning
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Searches g_oper_spec_data and returns any instance of operator name. There may
|
|
||||||
be more instances, but since the list is sorted, they will be next to each other.
|
|
||||||
*/
|
|
||||||
static const QwtMmlOperSpec *searchOperSpecData( const QString &name )
|
|
||||||
{
|
|
||||||
const char *name_latin1 = name.toLatin1().data();
|
|
||||||
|
|
||||||
// binary search
|
|
||||||
// establish invariant g_oper_spec_data[begin].name < name < g_oper_spec_data[end].name
|
|
||||||
|
|
||||||
int cmp = qstrcmp( name_latin1, g_oper_spec_data[0].name );
|
|
||||||
if ( cmp < 0 )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if ( cmp == 0 )
|
|
||||||
return g_oper_spec_data;
|
|
||||||
|
|
||||||
uint begin = 0;
|
|
||||||
uint end = g_oper_spec_count;
|
|
||||||
|
|
||||||
// invariant holds
|
|
||||||
while ( end - begin > 1 )
|
|
||||||
{
|
|
||||||
uint mid = ( begin + end ) / 2;
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *spec = g_oper_spec_data + mid;
|
|
||||||
int cmp = qstrcmp( name_latin1, spec->name );
|
|
||||||
if ( cmp < 0 )
|
|
||||||
end = mid;
|
|
||||||
else if ( cmp > 0 )
|
|
||||||
begin = mid;
|
|
||||||
else
|
|
||||||
return spec;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This searches g_oper_spec_data until at least one name in name_list is found with FormType form,
|
|
||||||
or until name_list is exhausted. The idea here is that if we don't find the operator in the
|
|
||||||
specified form, we still want to use some other available form of that operator.
|
|
||||||
*/
|
|
||||||
static OperSpecSearchResult _mmlFindOperSpec( const QStringList &name_list, QwtMml::FormType form )
|
|
||||||
{
|
|
||||||
OperSpecSearchResult result;
|
|
||||||
|
|
||||||
QStringList::const_iterator it = name_list.begin();
|
|
||||||
for ( ; it != name_list.end(); ++it )
|
|
||||||
{
|
|
||||||
const QString &name = *it;
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *spec = searchOperSpecData( name );
|
|
||||||
|
|
||||||
if ( spec == 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
const char *name_latin1 = name.toLatin1().data();
|
|
||||||
|
|
||||||
// backtrack to the first instance of name
|
|
||||||
while ( spec > g_oper_spec_data && qstrcmp( ( spec - 1 )->name, name_latin1 ) == 0 )
|
|
||||||
--spec;
|
|
||||||
|
|
||||||
// iterate over instances of name until the instances are exhausted or until we
|
|
||||||
// find an instance in the specified form.
|
|
||||||
do
|
|
||||||
{
|
|
||||||
result.addForm( spec++ );
|
|
||||||
if ( result.haveForm( form ) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
while ( qstrcmp( spec->name, name_latin1 ) == 0 );
|
|
||||||
|
|
||||||
if ( result.haveForm( form ) )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
text is a string between <mo> and </mo>. It can be a character ('+'), an
|
|
||||||
entity reference ("∞") or a character reference ("∞"). Our
|
|
||||||
job is to find an operator spec in the operator dictionary (g_oper_spec_data)
|
|
||||||
that matches text. Things are further complicated by the fact, that many
|
|
||||||
operators come in several forms (prefix, infix, postfix).
|
|
||||||
|
|
||||||
If available, this function returns an operator spec matching text in the specified
|
|
||||||
form. If such operator is not available, returns an operator spec that matches
|
|
||||||
text, but of some other form in the preference order specified by the MathML spec.
|
|
||||||
If that's not available either, returns the default operator spec.
|
|
||||||
*/
|
|
||||||
static const QwtMmlOperSpec *mmlFindOperSpec( const QString &text, QwtMml::FormType form )
|
|
||||||
{
|
|
||||||
QStringList name_list;
|
|
||||||
name_list.append( text );
|
|
||||||
|
|
||||||
// First, just try to find text in the operator dictionary.
|
|
||||||
OperSpecSearchResult result = _mmlFindOperSpec( name_list, form );
|
|
||||||
|
|
||||||
if ( !result.haveForm( form ) )
|
|
||||||
{
|
|
||||||
// Try to find other names for the operator represented by text.
|
|
||||||
|
|
||||||
const QwtMmlEntitySpec *ent = 0;
|
|
||||||
for ( ;; )
|
|
||||||
{
|
|
||||||
ent = searchEntitySpecData( text, ent );
|
|
||||||
if ( ent == 0 )
|
|
||||||
break;
|
|
||||||
name_list.append( '&' + QString( ent->name ) + ';' );
|
|
||||||
++ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = _mmlFindOperSpec( name_list, form );
|
|
||||||
}
|
|
||||||
|
|
||||||
const QwtMmlOperSpec *spec = result.getForm( form );
|
|
||||||
if ( spec != 0 )
|
|
||||||
return spec;
|
|
||||||
|
|
||||||
spec = result.getForm( QwtMml::InfixForm );
|
|
||||||
if ( spec != 0 )
|
|
||||||
return spec;
|
|
||||||
|
|
||||||
spec = result.getForm( QwtMml::PostfixForm );
|
|
||||||
if ( spec != 0 )
|
|
||||||
return spec;
|
|
||||||
|
|
||||||
spec = result.getForm( QwtMml::PrefixForm );
|
|
||||||
if ( spec != 0 )
|
|
||||||
return spec;
|
|
||||||
|
|
||||||
return &g_oper_spec_defaults;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QString mmlDictAttribute( const QString &name, const QwtMmlOperSpec *spec )
|
|
||||||
{
|
|
||||||
int i = attributeIndex( name );
|
|
||||||
if ( i == -1 )
|
|
||||||
return QString::null;
|
|
||||||
else
|
|
||||||
return spec->attributes[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint interpretMathVariant( const QString &value, bool *ok )
|
|
||||||
{
|
|
||||||
struct MathVariantValue
|
|
||||||
{
|
|
||||||
const char *value;
|
|
||||||
uint mv;
|
|
||||||
};
|
|
||||||
|
|
||||||
static const MathVariantValue g_mv_data[] =
|
|
||||||
{
|
|
||||||
{ "normal", QwtMml::NormalMV },
|
|
||||||
{ "bold", QwtMml::BoldMV },
|
|
||||||
{ "italic", QwtMml::ItalicMV },
|
|
||||||
{ "bold-italic", QwtMml::BoldMV | QwtMml::ItalicMV },
|
|
||||||
{ "double-struck", QwtMml::DoubleStruckMV },
|
|
||||||
{ "bold-fraktur", QwtMml::BoldMV | QwtMml::FrakturMV },
|
|
||||||
{ "script", QwtMml::ScriptMV },
|
|
||||||
{ "bold-script", QwtMml::BoldMV | QwtMml::ScriptMV },
|
|
||||||
{ "fraktur", QwtMml::FrakturMV },
|
|
||||||
{ "sans-serif", QwtMml::SansSerifMV },
|
|
||||||
{ "bold-sans-serif", QwtMml::BoldMV | QwtMml::SansSerifMV },
|
|
||||||
{ "sans-serif-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV },
|
|
||||||
{ "sans-serif-bold-italic", QwtMml::SansSerifMV | QwtMml::ItalicMV | QwtMml::BoldMV },
|
|
||||||
{ "monospace", QwtMml::MonospaceMV },
|
|
||||||
{ 0, 0 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const MathVariantValue *v = g_mv_data;
|
|
||||||
for ( ; v->value != 0; ++v )
|
|
||||||
{
|
|
||||||
if ( value == v->value )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
return v->mv;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
qWarning( "interpretMathVariant(): could not parse value: \"%s\"", value.toLatin1().data() );
|
|
||||||
|
|
||||||
return QwtMml::NormalMV;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QwtMml::FormType interpretForm( const QString &value, bool *ok )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( value == "prefix" )
|
|
||||||
return QwtMml::PrefixForm;
|
|
||||||
if ( value == "infix" )
|
|
||||||
return QwtMml::InfixForm;
|
|
||||||
if ( value == "postfix" )
|
|
||||||
return QwtMml::PostfixForm;
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
qWarning( "interpretForm(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
||||||
return QwtMml::InfixForm;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QwtMml::ColAlign interpretColAlign( const QString &value_list, uint colnum, bool *ok )
|
|
||||||
{
|
|
||||||
QString value = interpretListAttr( value_list, colnum, "center" );
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( value == "left" )
|
|
||||||
return QwtMml::ColAlignLeft;
|
|
||||||
if ( value == "right" )
|
|
||||||
return QwtMml::ColAlignRight;
|
|
||||||
if ( value == "center" )
|
|
||||||
return QwtMml::ColAlignCenter;
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
qWarning( "interpretColAlign(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
||||||
return QwtMml::ColAlignCenter;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QwtMml::RowAlign interpretRowAlign( const QString &value_list, uint rownum, bool *ok )
|
|
||||||
{
|
|
||||||
QString value = interpretListAttr( value_list, rownum, "axis" );
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( value == "top" )
|
|
||||||
return QwtMml::RowAlignTop;
|
|
||||||
if ( value == "center" )
|
|
||||||
return QwtMml::RowAlignCenter;
|
|
||||||
if ( value == "bottom" )
|
|
||||||
return QwtMml::RowAlignBottom;
|
|
||||||
if ( value == "baseline" )
|
|
||||||
return QwtMml::RowAlignBaseline;
|
|
||||||
if ( value == "axis" )
|
|
||||||
return QwtMml::RowAlignAxis;
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
qWarning( "interpretRowAlign(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
||||||
return QwtMml::RowAlignAxis;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QString interpretListAttr( const QString &value_list, int idx, const QString &def )
|
|
||||||
{
|
|
||||||
QStringList l = value_list.split( ' ' );
|
|
||||||
|
|
||||||
if ( l.count() == 0 )
|
|
||||||
return def;
|
|
||||||
|
|
||||||
if ( l.count() <= idx )
|
|
||||||
return l[l.count() - 1];
|
|
||||||
else
|
|
||||||
return l[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
static QwtMml::FrameType interpretFrameType( const QString &value_list, uint idx, bool *ok )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
QString value = interpretListAttr( value_list, idx, "none" );
|
|
||||||
|
|
||||||
if ( value == "none" )
|
|
||||||
return QwtMml::FrameNone;
|
|
||||||
if ( value == "solid" )
|
|
||||||
return QwtMml::FrameSolid;
|
|
||||||
if ( value == "dashed" )
|
|
||||||
return QwtMml::FrameDashed;
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
|
|
||||||
qWarning( "interpretFrameType(): could not parse value \"%s\"", value.toLatin1().data() );
|
|
||||||
return QwtMml::FrameNone;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static QwtMml::FrameSpacing interpretFrameSpacing( const QString &value_list, int em, int ex, bool *ok )
|
|
||||||
{
|
|
||||||
QwtMml::FrameSpacing fs;
|
|
||||||
|
|
||||||
QStringList l = value_list.split( ' ' );
|
|
||||||
if ( l.count() != 2 )
|
|
||||||
{
|
|
||||||
qWarning( "interpretFrameSpacing: could not parse value \"%s\"", value_list.toLatin1().data() );
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
return QwtMml::FrameSpacing( ( int )( 0.4 * em ), ( int )( 0.5 * ex ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hor_ok, ver_ok;
|
|
||||||
fs.m_hor = interpretSpacing( l[0], em, ex, &hor_ok );
|
|
||||||
fs.m_ver = interpretSpacing( l[1], em, ex, &ver_ok );
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = hor_ok && ver_ok;
|
|
||||||
|
|
||||||
return fs;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QFont interpretDepreciatedFontAttr( const QwtMmlAttributeMap &font_attr, QFont &fn, int em, int ex )
|
|
||||||
{
|
|
||||||
if ( font_attr.contains( "fontsize" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["fontsize"];
|
|
||||||
|
|
||||||
for ( ;; )
|
|
||||||
{
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
int ptsize = interpretPointSize( value, &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
fn.setPointSize( ptsize );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptsize = interpretPercentSpacing( value, fn.pointSize(), &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
fn.setPointSize( ptsize );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int size = interpretSpacing( value, em, ex, &ok );
|
|
||||||
if ( ok )
|
|
||||||
{
|
|
||||||
fn.setPixelSize( size );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( font_attr.contains( "fontweight" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["fontweight"];
|
|
||||||
if ( value == "normal" )
|
|
||||||
fn.setBold( false );
|
|
||||||
else if ( value == "bold" )
|
|
||||||
fn.setBold( true );
|
|
||||||
else
|
|
||||||
qWarning( "interpretDepreciatedFontAttr(): could not parse fontweight \"%s\"", value.toLatin1().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( font_attr.contains( "fontstyle" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["fontstyle"];
|
|
||||||
if ( value == "normal" )
|
|
||||||
fn.setItalic( false );
|
|
||||||
else if ( value == "italic" )
|
|
||||||
fn.setItalic( true );
|
|
||||||
else
|
|
||||||
qWarning( "interpretDepreciatedFontAttr(): could not parse fontstyle \"%s\"", value.toLatin1().data() );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( font_attr.contains( "fontfamily" ) )
|
|
||||||
{
|
|
||||||
QString value = font_attr["fontfamily"];
|
|
||||||
fn.setFamily( value );
|
|
||||||
}
|
|
||||||
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
static QFont interpretMathSize( QString value, QFont &fn, int em, int ex, bool *ok )
|
|
||||||
{
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = true;
|
|
||||||
|
|
||||||
if ( value == "small" )
|
|
||||||
{
|
|
||||||
fn.setPointSize( ( int )( fn.pointSize() * 0.7 ) );
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( value == "normal" )
|
|
||||||
return fn;
|
|
||||||
|
|
||||||
if ( value == "big" )
|
|
||||||
{
|
|
||||||
fn.setPointSize( ( int )( fn.pointSize() * 1.5 ) );
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool size_ok;
|
|
||||||
|
|
||||||
int ptsize = interpretPointSize( value, &size_ok );
|
|
||||||
if ( size_ok )
|
|
||||||
{
|
|
||||||
fn.setPointSize( ptsize );
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
int size = interpretSpacing( value, em, ex, &size_ok );
|
|
||||||
if ( size_ok )
|
|
||||||
{
|
|
||||||
fn.setPixelSize( size );
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( ok != 0 )
|
|
||||||
*ok = false;
|
|
||||||
qWarning( "interpretMathSize(): could not parse mathsize \"%s\"", value.toLatin1().data() );
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
\class QwtMathMLDocument
|
|
||||||
|
|
||||||
\brief The QwtMathMLDocument class renders mathematical formulas written in MathML 2.0.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Constructs an empty MML document.
|
|
||||||
*/
|
|
||||||
QwtMathMLDocument::QwtMathMLDocument()
|
|
||||||
{
|
|
||||||
m_doc = new QwtMmlDocument;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Destroys the MML document.
|
|
||||||
*/
|
|
||||||
QwtMathMLDocument::~QwtMathMLDocument()
|
|
||||||
{
|
|
||||||
delete m_doc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Clears the contents of this MML document.
|
|
||||||
*/
|
|
||||||
void QwtMathMLDocument::clear()
|
|
||||||
{
|
|
||||||
m_doc->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the MathML expression to be rendered. The expression is given
|
|
||||||
in the string \a text. If the expression is successfully parsed,
|
|
||||||
this method returns true; otherwise it returns false. If an error
|
|
||||||
occured \a errorMsg is set to a diagnostic message, while \a
|
|
||||||
errorLine and \a errorColumn contain the location of the error.
|
|
||||||
Any of \a errorMsg, \a errorLine and \a errorColumn may be 0,
|
|
||||||
in which case they are not set.
|
|
||||||
|
|
||||||
\a text should contain MathML 2.0 presentation markup elements enclosed
|
|
||||||
in a <math> element.
|
|
||||||
*/
|
|
||||||
bool QwtMathMLDocument::setContent( QString text, QString *errorMsg,
|
|
||||||
int *errorLine, int *errorColumn )
|
|
||||||
{
|
|
||||||
return m_doc->setContent( text, errorMsg, errorLine, errorColumn );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Renders this MML document with the painter \a p at position \a pos.
|
|
||||||
*/
|
|
||||||
void QwtMathMLDocument::paint( QPainter *p, const QPoint &pos ) const
|
|
||||||
{
|
|
||||||
m_doc->paint( p, pos );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the size of this MML document, as rendered, in pixels.
|
|
||||||
*/
|
|
||||||
QSize QwtMathMLDocument::size() const
|
|
||||||
{
|
|
||||||
return m_doc->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the name of the font used to render the font \a type.
|
|
||||||
|
|
||||||
\sa setFontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont
|
|
||||||
*/
|
|
||||||
QString QwtMathMLDocument::fontName( QwtMathMLDocument::MmlFont type ) const
|
|
||||||
{
|
|
||||||
return m_doc->fontName( type );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the name of the font used to render the font \a type to \a name.
|
|
||||||
|
|
||||||
\sa fontName() setBaseFontPointSize() baseFontPointSize() QwtMathMLDocument::MmlFont
|
|
||||||
*/
|
|
||||||
void QwtMathMLDocument::setFontName( QwtMathMLDocument::MmlFont type, const QString &name )
|
|
||||||
{
|
|
||||||
m_doc->setFontName( type, name );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Returns the point size of the font used to render expressions
|
|
||||||
whose scriptlevel is 0.
|
|
||||||
|
|
||||||
\sa setBaseFontPointSize() fontName() setFontName()
|
|
||||||
*/
|
|
||||||
int QwtMathMLDocument::baseFontPointSize() const
|
|
||||||
{
|
|
||||||
return m_doc->baseFontPointSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*!
|
|
||||||
Sets the point \a size of the font used to render expressions
|
|
||||||
whose scriptlevel is 0.
|
|
||||||
|
|
||||||
\sa baseFontPointSize() fontName() setFontName()
|
|
||||||
*/
|
|
||||||
void QwtMathMLDocument::setBaseFontPointSize( int size )
|
|
||||||
{
|
|
||||||
m_doc->setBaseFontPointSize( size );
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
#ifndef _QWT_MML_DOCUMENT_H_
|
|
||||||
#define _QWT_MML_DOCUMENT_H_ 1
|
|
||||||
|
|
||||||
#include <qwt_global.h>
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
class QPainter;
|
|
||||||
class QPoint;
|
|
||||||
|
|
||||||
class QwtMmlDocument;
|
|
||||||
|
|
||||||
class QWT_EXPORT QwtMathMLDocument
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum MmlFont
|
|
||||||
{
|
|
||||||
NormalFont,
|
|
||||||
FrakturFont,
|
|
||||||
SansSerifFont,
|
|
||||||
ScriptFont,
|
|
||||||
MonospaceFont,
|
|
||||||
DoublestruckFont
|
|
||||||
};
|
|
||||||
|
|
||||||
QwtMathMLDocument();
|
|
||||||
~QwtMathMLDocument();
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
bool setContent( QString text, QString *errorMsg = 0,
|
|
||||||
int *errorLine = 0, int *errorColumn = 0 );
|
|
||||||
void paint( QPainter *p, const QPoint &pos ) const;
|
|
||||||
QSize size() const;
|
|
||||||
|
|
||||||
QString fontName( MmlFont type ) const;
|
|
||||||
void setFontName( MmlFont type, const QString &name );
|
|
||||||
|
|
||||||
int baseFontPointSize() const;
|
|
||||||
void setBaseFontPointSize( int size );
|
|
||||||
|
|
||||||
private:
|
|
||||||
QwtMmlDocument *m_doc;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,38 +0,0 @@
|
|||||||
################################################################
|
|
||||||
# Qwt Widget Library
|
|
||||||
# Copyright (C) 1997 Josef Wilgen
|
|
||||||
# Copyright (C) 2002 Uwe Rathmann
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
################################################################
|
|
||||||
|
|
||||||
include ( ./qwtconfig.pri )
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtDll) {
|
|
||||||
|
|
||||||
DEFINES *= QWT_DLL
|
|
||||||
}
|
|
||||||
|
|
||||||
QT *= xml
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtFramework) {
|
|
||||||
|
|
||||||
INCLUDEPATH *= $${QWT_INSTALL_LIBS}/qwtmathml.framework/Headers
|
|
||||||
LIBS *= -F$${QWT_INSTALL_LIBS}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
INCLUDEPATH *= $${QWT_INSTALL_HEADERS}
|
|
||||||
LIBS *= -L$${QWT_INSTALL_LIBS}
|
|
||||||
}
|
|
||||||
|
|
||||||
INCLUDEPATH_QWTMATHML = $${INCLUDEPATH}
|
|
||||||
qtAddLibrary(qwtmathml)
|
|
||||||
|
|
||||||
# we don't want qtAddLibrary to expand the
|
|
||||||
# include path, with directories, that might
|
|
||||||
# conflict with other installations of qwt
|
|
||||||
|
|
||||||
INCLUDEPATH = $${INCLUDEPATH_QWTMATHML}
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
|||||||
################################################################
|
|
||||||
# Qwt Widget Library
|
|
||||||
# Copyright (C) 1997 Josef Wilgen
|
|
||||||
# Copyright (C) 2002 Uwe Rathmann
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
################################################################
|
|
||||||
|
|
||||||
QWT_ROOT = $${PWD}/..
|
|
||||||
|
|
||||||
include( $${QWT_ROOT}/qwtconfig.pri )
|
|
||||||
include( $${QWT_ROOT}/qwtbuild.pri )
|
|
||||||
include( $${QWT_ROOT}/qwtfunctions.pri )
|
|
||||||
|
|
||||||
QWT_OUT_ROOT = $${OUT_PWD}/../..
|
|
||||||
|
|
||||||
TEMPLATE = lib
|
|
||||||
|
|
||||||
DESTDIR = $${QWT_OUT_ROOT}/lib
|
|
||||||
INCLUDEPATH += $${QWT_ROOT}/src
|
|
||||||
DEPENDPATH += $${QWT_ROOT}/src
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtDll) {
|
|
||||||
CONFIG += dll
|
|
||||||
win32|symbian: DEFINES += QT_DLL QWT_DLL QWT_MAKEDLL
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
CONFIG += staticlib
|
|
||||||
}
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtFramework) {
|
|
||||||
|
|
||||||
CONFIG += lib_bundle
|
|
||||||
LIBS += -F$${QWT_OUT_ROOT}/lib
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
LIBS += -L$${QWT_OUT_ROOT}/lib
|
|
||||||
}
|
|
||||||
|
|
||||||
qwtAddLibrary(qwt)
|
|
||||||
|
|
||||||
# Install directives
|
|
||||||
|
|
||||||
target.path = $${QWT_INSTALL_LIBS}
|
|
||||||
doc.path = $${QWT_INSTALL_DOCS}
|
|
||||||
|
|
||||||
INSTALLS = target
|
|
@ -1,16 +0,0 @@
|
|||||||
################################################################
|
|
||||||
# Qwt Widget Library
|
|
||||||
# Copyright (C) 1997 Josef Wilgen
|
|
||||||
# Copyright (C) 2002 Uwe Rathmann
|
|
||||||
#
|
|
||||||
# This library is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the Qwt License, Version 1.0
|
|
||||||
################################################################
|
|
||||||
|
|
||||||
include( $${PWD}/../qwtconfig.pri )
|
|
||||||
|
|
||||||
TEMPLATE = subdirs
|
|
||||||
|
|
||||||
contains(QWT_CONFIG, QwtMathML) {
|
|
||||||
SUBDIRS += mathml
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user