Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
desktop:htmleditor [2019/07/27 07:34]
agcyphers [Notes]
desktop:htmleditor [2019/10/28 16:06] (current)
agcyphers [Notes]
Line 49: Line 49:
 ==== Constants ==== ==== Constants ====
 ^ Name      ^ Type     ^ Value       ^ Description ​   ^ ^ Name      ^ Type     ^ Value       ^ Description ​   ^
-| AlignLeft ​| [[http://​developer.xojo.com/​integer|Integer]] | 0 | Left alignment of text. | +| AlignLeft | Integer | 0 | Left alignment of text. | 
-| AlignCenter ​| [[http://​developer.xojo.com/​integer|Integer]] | 1 | Center alignment of text. | +| AlignCenter | Integer | 1 | Center alignment of text. | 
-| AlignRight ​| [[http://​developer.xojo.com/​integer|Integer]] | 2  | Right alignment of text. | +| AlignRight | Integer | 2  | Right alignment of text. | 
-| HeaderNone ​| [[http://​developer.xojo.com/​integer|Integer]] | 0 | No header tag. | +| HeaderNone | Integer | 0 | No header tag. | 
-| Header1 ​| [[http://​developer.xojo.com/​integer|Integer]] | 1 | Corresponds to <H1> | +| Header1 | Integer | 1 | Corresponds to <H1> | 
-| Header2 ​| [[http://​developer.xojo.com/​integer|Integer]] | 2 | Corresponds to <H2> | +| Header2 | Integer | 2 | Corresponds to <H2> | 
-| Header3 ​| [[http://​developer.xojo.com/​integer|Integer]] | 2 | Corresponds to <H3> | +| Header3 | Integer | 2 | Corresponds to <H3> | 
-| Header4 ​| [[http://​developer.xojo.com/​integer|Integer]] | 2 | Corresponds to <H4> |+| Header4 | Integer | 2 | Corresponds to <​H4> ​
 +| jsTwitter_Preview | String | Script Tag | Script tag to enable Twitter previews in your generated documents. ​|
  
 ==== Events ==== ==== Events ====
 ^ Definition ​     ^ Description ​      ^ ^ Definition ​     ^ Description ​      ^
-| ContextClick( X as [[http://​developer.xojo.com/​integer|Integer]], Y as [[http://​developer.xojo.com/​integer|Integer]] ) | Raised when the user right-clicks the editor area. | +| ContextClick( X as Integer, Y as Integer ) | Raised when the user right-clicks the editor area. | 
-| EditorDefaults( byRef DefaultFontFace as String, byRef DefaultFontSize as [[http://​developer.xojo.com/​integer|Integer]] ) | Raised during initialization to set font defaults for the editor. | +| EditorDefaults( byRef DefaultFontFace as String, byRef DefaultFontSize as Integer, byRef allowNesting as Boolean ​) | Raised during initialization to set font defaults for the editor. ''​allowNesting''​ controls whether lists can be nested. | 
-| MenuClear() as [[http://​developer.xojo.com/​boolean|Boolean]] | This event is fired when the user has selected Clear from the edit menu.  Return True to override default. | +| MenuClear() as Boolean | This event is fired when the user has selected Clear from the edit menu.  Return True to override default. | 
-| MenuCopy() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Copy from the edit menu.  Return True to override default. | +| MenuCopy() as Boolean | Fired when user selects Copy from the edit menu.  Return True to override default. | 
-| MenuCut() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Cut from the edit menu.  Return True to override default. | +| MenuCut() as Boolean | Fired when user selects Cut from the edit menu.  Return True to override default. | 
-| MenuPaste() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Paste from the edit menu.  Return True to override default. | +| MenuPaste() as Boolean | Fired when user selects Paste from the edit menu.  Return True to override default. | 
-| MenuRedo() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Redo from the edit menu.  Return True to override default. | +| MenuRedo() as Boolean | Fired when user selects Redo from the edit menu.  Return True to override default. | 
-| MenuSelectAll() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Select All from the edit menu.  Return True to override default. | +| MenuSelectAll() as Boolean | Fired when user selects Select All from the edit menu.  Return True to override default. | 
-| MenuUndo() as [[http://​developer.xojo.com/​boolean|Boolean]] | Fired when user selects Unde from the edit menu.  Return True to override default. |+| MenuUndo() as Boolean | Fired when user selects Unde from the edit menu.  Return True to override default. |
 | SelChange() | Fired when the user changes the current selection in the editor. | | SelChange() | Fired when the user changes the current selection in the editor. |
 | TextChanged | This event triggers when the text changes. | | TextChanged | This event triggers when the text changes. |
 | Toolbar_BackgroundClick() | Fired when the user clicks the Background Color button on the toolbar. | | Toolbar_BackgroundClick() | Fired when the user clicks the Background Color button on the toolbar. |
-| Toolbar_ButtonClick(buttonID as [[http://​developer.xojo.com/​string|String]] | Fired when the user clicks a custom button on the toolbar. |+| Toolbar_ButtonClick(buttonID as String | Fired when the user clicks a custom button on the toolbar. |
 | Toolbar_ColorClick() | Fired when the user clicks the Foreground Color button on the toolbar. | | Toolbar_ColorClick() | Fired when the user clicks the Foreground Color button on the toolbar. |
 | Toolbar_ImageClick() | Fired when the user clicks the Insert Image button on the toolbar. | | Toolbar_ImageClick() | Fired when the user clicks the Insert Image button on the toolbar. |
Line 78: Line 79:
 | Toolbar_LinkClick() | Fired when the user clicks the Insert Link button on the toolbar. | | Toolbar_LinkClick() | Fired when the user clicks the Insert Link button on the toolbar. |
 | Toolbar_VideoClick() | Fired when the user clicks the Insert Video button on the toolbar. | | Toolbar_VideoClick() | Fired when the user clicks the Insert Video button on the toolbar. |
-| UserDroppedImage(url as [[http://​developer.xojo.com/​string|String]]) as [[http://​developer.xojo.com/​boolean|Boolean]] | This event triggers if a user drops an image onto HTML Edit. Useful to override the default insert behavior. The dropped file is passed as a URL, not a FolderItem. Return True to handle the event yourself, or false to allow the automatic insert. |+| UserDroppedImage(url as String) as Boolean | This event triggers if a user drops an image onto HTML Edit. Useful to override the default insert behavior. The dropped file is passed as a URL, not a FolderItem. Return True to handle the event yourself, or false to allow the automatic insert. |
  
 ==== Methods ==== ==== Methods ====
Line 91: Line 92:
 | Cut() | Copies the currently selected text to the clipboard, then removes it from the editor. | | Cut() | Copies the currently selected text to the clipboard, then removes it from the editor. |
 | Delete() | Deletes the currently selected text from the editor. This has the same effect as <code xojo>​GraffitiHTMLEditor.SelText = ""</​code>​ | | Delete() | Deletes the currently selected text from the editor. This has the same effect as <code xojo>​GraffitiHTMLEditor.SelText = ""</​code>​ |
 +| ExportCSS() as String | Returns a string containing all CSS styles that could not be made inline. |
 | ForceUpdate() | Forces the instance to update the Selection, Content, and Format properties from the display. | | ForceUpdate() | Forces the instance to update the Selection, Content, and Format properties from the display. |
 | HashTag(tagID as Integer) as String | Returns the HashTag at the specified index. | | HashTag(tagID as Integer) as String | Returns the HashTag at the specified index. |
 | HashTagCount() as Integer | Returns the total number of HashTags (UBOUND + 1). | | HashTagCount() as Integer | Returns the total number of HashTags (UBOUND + 1). |
-| InsertAudio(SourceURL as [[http://​developer.xojo.com/​string|String]]) | Inserts an audio player element. ​ Note that the element will not be usable in the editor. |+| InsertAudio(SourceURL as String) | Inserts an audio player element. ​ Note that the element will not be usable in the editor. |
 | InsertDeltas( theDelta as JSONItem ) | ** (Advanced Use Only) ** Allows the insertion of QuillJS deltas directly in to the editor instance. | | InsertDeltas( theDelta as JSONItem ) | ** (Advanced Use Only) ** Allows the insertion of QuillJS deltas directly in to the editor instance. |
-| InsertFile(f as [[http://​developer.xojo.com/​folderitem|FolderItem]], optional atPosition as [[http://​developer.xojo.com/​integer|Integer]]) | If F points to an image file, the image is inserted via a call to InsertImage,​ otherwise a link is inserted in to the document using the local URL path type. |+| InsertFile(f as FolderItem, optional atPosition as Integer) | If F points to an image file, the image is inserted via a call to InsertImage,​ otherwise a link is inserted in to the document using the local URL path type. |
 | InsertHorizontalRule() | Inserts a Horizontal Rule in to the document. | | InsertHorizontalRule() | Inserts a Horizontal Rule in to the document. |
 | InsertHTML( htmlString as String ) | Inserts the specified HTML at current selection. | | InsertHTML( htmlString as String ) | Inserts the specified HTML at current selection. |
-| InsertImage(url as [[http://​developer.xojo.com/​string|String]], optional atPosition as [[http://​developer.xojo.com/​integer|Integer]]) | Insert an image into the content area. atPosition is optional, and if omitted the current cursor location will be used as an insertion point. Note that if you insert an image on the internet your application will attempt to connect to the internet. | +| InsertImage(url as String, optional atPosition as Integer) | Insert an image into the content area. atPosition is optional, and if omitted the current cursor location will be used as an insertion point. Note that if you insert an image on the internet your application will attempt to connect to the internet. | 
-| InsertImage(f as [[http://​developer.xojo.com/​folderitem|FolderItem]], optional atPosition as [[http://​developer.xojo.com/​integer|Integer]]) | ::: | +| InsertImage(f as FolderItem, optional atPosition as Integer) | ::: | 
-| InsertLink(url as [[http://​developer.xojo.com/​string|String]], title as [[http://​developer.xojo.com/​string|String]] = "",​ atPosition as [[http://​developer.xojo.com/​integer|Integer]] = 0) | Inserts a link into the content area. atPosition is optional, and if omitted the current cursor location will be used as an insertion point. |+| InsertLink(url as String, title as String = "",​ atPosition as Integer = 0) | Inserts a link into the content area. atPosition is optional, and if omitted the current cursor location will be used as an insertion point. |
 | InsertTable(Rows as Integer, Columns as Integer) | Inserts a table in to the document. | | InsertTable(Rows as Integer, Columns as Integer) | Inserts a table in to the document. |
 | InsertTableColumn() | Adds a column to the current table. | | InsertTableColumn() | Adds a column to the current table. |
 | InsertTableRow() | Adds a row to the current table. | | InsertTableRow() | Adds a row to the current table. |
 | InsertTweet(TweetID as [[http://​developer.xojo.com/​integer-size-specific|Int64]]) | Inserts a Tweet using the Tweet'​s unique ID. | | InsertTweet(TweetID as [[http://​developer.xojo.com/​integer-size-specific|Int64]]) | Inserts a Tweet using the Tweet'​s unique ID. |
-| InsertTweet(URL as [[http://​developer.xojo.com/​string|String]]) | Inserts a Tweet using the Tweet'​s URL. | +| InsertTweet(URL as String) | Inserts a Tweet using the Tweet'​s URL. | 
-| InsertVideo(URL as [[http://​developer.xojo.com/​string|String]]) | Inserts a video element in to the document. |+| InsertVideo(URL as String) | Inserts a video element in to the document. |
 | LoaderHide() | Hides the loading spinner. | | LoaderHide() | Hides the loading spinner. |
 | LoaderShow() | Shows a loading spinner that covers the entire component. | | LoaderShow() | Shows a loading spinner that covers the entire component. |
Line 119: Line 121:
 | RemoveMention(mentionID as Integer) | Removes the Mention at the specified index. | | RemoveMention(mentionID as Integer) | Removes the Mention at the specified index. |
 | SelectAll() | Select all contents. | | SelectAll() | Select all contents. |
-| ToolbarAddButton(ButtonID as [[http://​developer.xojo.com/​string|String]], ButtonCaption as [[http://​developer.xojo.com/​string|String]], ButtonTooltip as [[http://​developer.xojo.com/​string|String]] = ""​) | Adds a custom button to the toolbar, in the Custom section. | +| ToolbarAddButton(ButtonID as String, ButtonCaption as String, ButtonTooltip as String = ""​) | Adds a custom button to the toolbar, in the Custom section. | 
-| ToolbarItemVisible(ParamArray theItem as ToolbarItems,​ assigns value as [[http://​developer.xojo.com/​boolean|Boolean]]) | Sets the visibility of one or more toolbar buttons. | +| ToolbarItemVisible(ParamArray theItem as ToolbarItems,​ assigns value as Boolean) | Sets the visibility of one or more toolbar buttons. | 
-| ToolbarItemVisible_Custom(CustomID as [[http://​developer.xojo.com/​string|String]], Value as [[http://​developer.xojo.com/​boolean|Boolean]]) | Sets the visibility of a custom button in the toolbar. | +| ToolbarItemVisible_Custom(CustomID as String, Value as Boolean) | Sets the visibility of a custom button in the toolbar. | 
-| ToolbarRemoveButton(ButtonID as [[http://​developer.xojo.com/​string|String]]) | Removes a custom button from the toolbar. | +| ToolbarRemoveButton(ButtonID as String) | Removes a custom button from the toolbar. | 
-| theItem as ToolbarItems,​ theTooltip as [[http://​developer.xojo.com/​string|String]], CustomButtonID as [[http://​developer.xojo.com/​string|String]] = ""​ | Sets the tooltip of a toolbar item. |+ToolbarTooltip(theItem as ToolbarItems,​ theTooltip as String, CustomButtonID as String = ""​ | Sets the tooltip of a toolbar item. | 
 +| toPage(pageTitle as String, includeStyleBlock as Boolean = False) as String | Creates a standalone HTML page from the content. | 
 +| toPageInline(pageTitle as String, Minimize as Boolean = True) as String | Creates a standalone HTML page from the content with all styles made inline that are possible to do so. |
 | Undo() | Steps backward in the change stack to remove a previous change. | | Undo() | Steps backward in the change stack to remove a previous change. |
  
 ==== Properties ==== ==== Properties ====
 ^ Name      ^ Type       ^ Default Value       ^ Description ​      ^ ^ Name      ^ Type       ^ Default Value       ^ Description ​      ^
-| CanRedo ''​Read-Only'' ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Whether Redo is currently available. | +| CanRedo ''​Read-Only''​ | Boolean | False | Whether Redo is currently available. | 
-| CanUndo ''​Read-Only'' ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Whether Undo is currently available. | +| CanUndo ''​Read-Only''​ | Boolean | False | Whether Undo is currently available. | 
-| DarkMode ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | When True, the control is restyled to more closely match the new OS dark modes. | +| DarkMode | Boolean | False | When True, the control is restyled to more closely match the new OS dark modes. | 
-| EditorBackground ​| [[http://​developer.xojo.com/​color|Color]] | &​cFFFFFF | Controls the background color of the entire editor (not toolbar). | +| EditorBackground | Color | &​cFFFFFF | Controls the background color of the entire editor (not toolbar). | 
-| Enabled ​| [[http://​developer.xojo.com/​boolean|Boolean]] | True | Whether or not the edit field is enabled. Due to current limitations one cannot disable the rich text toolbar, however formatting conditions may not be changed by the user while enabled is false. |+| Enabled | Boolean | True | Whether or not the edit field is enabled. Due to current limitations one cannot disable the rich text toolbar, however formatting conditions may not be changed by the user while enabled is false. |
 | EnforceHTTPS | Boolean | True | When True, URls will be automatically converted to HTTPS. | | EnforceHTTPS | Boolean | True | When True, URls will be automatically converted to HTTPS. |
-| HTML | [[http://​developer.xojo.com/​string|String]] | ""​ | Get and set the HTML contents. | +| HTML | String | ""​ | Get and set the HTML contents. | 
-| Length ​| [[http://​developer.xojo.com/​integer|Integer]] | 0 | The number of characters in the editor. | +| Length | Integer | 0 | The number of characters in the editor. | 
-| PlainText ​| [[http://​developer.xojo.com/​string|String]] | ""​ | The current content of the editor with all HTML removed. | +| PlainText | String | ""​ | The current content of the editor with all HTML removed. | 
-| SelAlign ​| [[http://​developer.xojo.com/​integer|Integer]] | AlignLeft | Current alignment of text within the editor. | +| SelAlign | Integer | AlignLeft | Current alignment of text within the editor. | 
-| SelBold ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Get and set the bold property for currently selected text. If any portion of the selected text is bold this will return true. |+| SelBold | Boolean | False | Get and set the bold property for currently selected text. If any portion of the selected text is bold this will return true. |
 | SelFont | String | System | Text font of the currently selected text. | | SelFont | String | System | Text font of the currently selected text. |
-| SelHeader ​| [[http://​developer.xojo.com/​integer|Integer]] | HeaderNone | Header style of currently selected text. | +| SelHeader | Integer | HeaderNone | Header style of currently selected text. | 
-| SelItalic ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Get and set the italic property for currently selected text. If any portion of the selected text is italic this will return true. | +| SelItalic | Boolean | False | Get and set the italic property for currently selected text. If any portion of the selected text is italic this will return true. | 
-| SelLength ​| [[http://​developer.xojo.com/​integer|Integer]] | 0 | The number of highlighted characters. | +| SelLength | Integer | 0 | The number of highlighted characters. | 
-| SelListChecked ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Determines if current selection is a checked list. | +| SelListChecked | Boolean | False | Determines if current selection is a checked list. | 
-| SelListOrdered ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Determines if current selection is an ordered list. | +| SelListOrdered | Boolean | False | Determines if current selection is an ordered list. | 
-| SelListUnordered ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Determines if current selection is an ordered list. | +| SelListUnordered | Boolean | False | Determines if current selection is an ordered list. | 
-| SelPlain ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | If true the selected text is all plain. When setting it will make all selected text plain (unformatted) | +| SelPlain | Boolean | False | If true the selected text is all plain. When setting it will make all selected text plain (unformatted) | 
-| SelStart ​| [[http://​developer.xojo.com/​integer|Integer]] | 0 | The position of the insertion point. A value of zero is before the first character. | +| SelStart | Integer | 0 | The position of the insertion point. A value of zero is before the first character. | 
-| SelStrike ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Get and set the strikethrough property for currently selected text. If any portion of the selected text is struck this will return true. | +| SelStrike | Boolean | False | Get and set the strikethrough property for currently selected text. If any portion of the selected text is struck this will return true. | 
-| SelSubscript ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Subscript setting of current text. | +| SelSubscript | Boolean | False | Subscript setting of current text. | 
-| SelSuperscript ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Superscript setting of current text. | +| SelSuperscript | Boolean | False | Superscript setting of current text. | 
-| SelText ​| [[http://​developer.xojo.com/​string|String]] | ""​ | The currently highlighted text. Setting this inserts text into the content. | +| SelText | String | ""​ | The currently highlighted text. Setting this inserts text into the content. | 
-| SelTextBackground ​| [[http://​developer.xojo.com/​color|Color]] | &​cFFFFFF | Get and set the color property for currently selected text's background color. When getting this value the control will return the first color it encounters in the selected text. If no color is encountered,​ white is returned. | +| SelTextBackground | Color | &​cFFFFFF | Get and set the color property for currently selected text's background color. When getting this value the control will return the first color it encounters in the selected text. If no color is encountered,​ white is returned. | 
-| SelTextColor ​| [[http://​developer.xojo.com/​color|Color]] | &​c000000 | Get and set the color property for currently selected text. When getting this value the control will return the first color it encounters in the selected text. If no color is encountered,​ black is returned. | +| SelTextColor | Color | &​c000000 | Get and set the color property for currently selected text. When getting this value the control will return the first color it encounters in the selected text. If no color is encountered,​ black is returned. | 
-| SelTextSize ​| [[http://​developer.xojo.com/​integer|Integer]] | 12 | Get and set the text size in pixels for currently selected text. The pixels limitation is from Quill (I prefer setting things in point.) When getting this value, the control will return the first size change it encounters in the selected text. If no size change is encountered the default font size of 12px is returned. | +| SelTextSize | Integer | 12 | Get and set the text size in pixels for currently selected text. The pixels limitation is from Quill (I prefer setting things in point.) When getting this value, the control will return the first size change it encounters in the selected text. If no size change is encountered the default font size of 12px is returned. | 
-| SelUnderline ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Get and set the underline property for currently selected text. If any portion of the selected text is underlined this will return true. | +| SelUnderline | Boolean | False | Get and set the underline property for currently selected text. If any portion of the selected text is underlined this will return true. | 
-| ShowLoaderOnEvents ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | If true, the loading spinner will be shown to denote that the control is busy when communicating. | +| ShowLoaderOnEvents | Boolean | False | If true, the loading spinner will be shown to denote that the control is busy when communicating. | 
-| SpellCheck ​| [[http://​developer.xojo.com/​boolean|Boolean]] | False | Controls whether the OS/Browser spelling checker is enabled on the editor. | +| SpellCheck | Boolean | False | Controls whether the OS/Browser spelling checker is enabled on the editor. | 
-| ToolbarBackgroundColor ​| [[http://​developer.xojo.com/​color|Color]] | &​cFFFFFF | Controls the background color of the toolbar and buttons. | +| ToolbarBackgroundColor | Color | &​cFFFFFF | Controls the background color of the toolbar and buttons. | 
-| ToolbarVisible ​| [[http://​developer.xojo.com/​boolean|Boolean]] | True | Controls the visibility of the toolbar. | +| ToolbarVisible | Boolean | True | Controls the visibility of the toolbar. | 
-WordWrap ​[[http://​developer.xojo.com/​boolean|Boolean]] | True | If False, content will not wrap lines. |+UseXHR ​Boolean | False | When True, will use XmlHttpRequests to return data rather than length-constrained packets
 +| WordWrap ​| Boolean | True | If False, content will not wrap lines. |
 ==== Examples ==== ==== Examples ====
  
Line 177: Line 182:
 With recent changes to Xojo on MacOS, NSAppTransportSecurity is now an issue when embedding images, audio, or video in GraffitiHTMLEditor. To cope with this you can add information to your info.plist to allow either specific hosts to bypass enforcement of the HTTPS protocol requirement or allow all hosts. For more information on this, please review [[https://​docs.xojo.com/​UserGuide:​App_Transport_Security|this page]] in the Xojo Documentation. With recent changes to Xojo on MacOS, NSAppTransportSecurity is now an issue when embedding images, audio, or video in GraffitiHTMLEditor. To cope with this you can add information to your info.plist to allow either specific hosts to bypass enforcement of the HTTPS protocol requirement or allow all hosts. For more information on this, please review [[https://​docs.xojo.com/​UserGuide:​App_Transport_Security|this page]] in the Xojo Documentation.
  
-As of R29 the property ''​EnforceHTTPS as Boolean = True''​ has been added to aid in coping with this. When True any resource ​URL (with the exception of ''​file'',​ ''​ftp'',​ or ''​smb''​) that a user attempts to embed will be required to use HTTPS by replacing the protocol identifier (''​HTTP''​ becomes ''​HTTPS''​).+As of R29 the property ''​EnforceHTTPS as Boolean = True''​ has been added to aid in coping with this. When True any resource ​URI (with the exception of ''​data'', ​''​file'',​ ''​ftp'',​ or ''​smb''​) that a user attempts to embed will be required to use HTTPS by replacing the protocol identifier (''​HTTP''​ becomes ''​HTTPS''​).