The major changes in this release are:
- Ability to save databases
- Standard Cocoa document handling (Save a Version, Open Recent, Revert Document, autosaving, etc.)
- Multi-level undo
- First draft of standard menu configuration
- Data Sheet context menus for cells and columns
- Add/Delete fields, modify field properties
- Live Menus
- Import
- Over 300 new statements and functions
- "Procedure Mode" "calculations"
- Permanent variables
- Full screen mode
- View and Action menus now display a red circle with a bang if the corresponding procedure contains an error
- Functions for encryption/decryption using AES-256.
- Added New Form to View menu
- Import/Export of forms and procedures
- superlookup( function now supports "wrap" option, per Dave Thompson's suggestion
Saving Databases
The biggest change in this release is of course the ability to actually save databases in the new format. New database files are saved with an extension of .pandb. Note: Most likely databases saved now will continue to be compatible with new releases from now on, but this is not absolutely guaranteed yet.
Standard Document Handling
In addition to saving, this new version supports the entire suite of standard Cocoa document handling features. In the File menu, the New, Open, Open Recent, Save a Version, Duplicate and Revert Document commands all work as expected for Cocoa applications (if you are using Mountain Lion or Mavericks, some of these items will have different names). Note: The RagelUnicode window no longer has an Open Database button, use File>Open instead.
Panorama also now supports standard Cocoa auto-save and versioning. These features were a bit controversial when 10.7 Lion came out, but they are the standard, and Panorama is 100% compatible with the Apple standard in this regard. The Revert Document command opens Apple’s “Time Machine” style screen for selecting previously saved versions. This mostly works, but I need to work on some edge cases (for example, reverting to a previous version where an open form didn’t exist may crash or do something unexpected).
Multi Level Undo
In addition to document versions, Panorama now supports multi-level undo. Currently there is no limit, though this may change to some fixed number (99? 24?) in the future to limit resource usage. I think multi-level undo may wind up being a “killer” feature of this new release. It’s pretty awesome to be able to undo even after doing things like deleting fields, deleting thousands of records, etc., especially since you don’t have to do so right away. I don’t think there has ever been any database with this capability. Note: One thing that can’t be undone out of the box is your own procedures, but they can be modified to support undo – it generally takes just one startdatabasechange statement to add undo support to any procedure.
Previous alpha versions basically had only “dummy” menus. This version has actual menus with actual Panorama menus commands. Just like in Panorama 6 and earlier, the menus automatically adjust as you switch from data sheet to form to graphics mode to procedure. This isn’t the final menu configuration – some commands still need to be added, some will be removed (especially some of the field properties, which will be in an inspector panel), and the entire menu configuration may be revamped. However, at least there are now menu commands that allow the program to be used without having to type in a program for every operation.
This version also adds context menus for the data sheet – right click on any data cell or on a column header to use them.
The menus now contain commands for adding, removing and modifying fields. The UI is a bit awkward, but you can now create a new database and set up the fields as needed. Note: Still on the to-do list are a field property inspector (which will replace many of the menu items), dragging fields to re-arrange them, and the ability to selectively hide fields. You may notice that there is an option to make a field non-editable in the data sheet (this isn’t really a security feature, it can still be modified by a procedure or form).
In addition to standard menus, this version now supports fully customizable Live Menus. This feature is a superset of the Live Menu feature in previous versions of Panorama. With this feature you have the same control over menu appearance as Cocoa developers have when using XCode’s Interface Builder. In fact, it’s even better because you can easily create dynamic menus, which can’t be done with IB. You can even embed Panorama code into individual menu items, eliminating the need for a .CustomMenu procedure (it is still supported). To learn about all the details see LMSL, menu(, menuitem( and filemenubar.
In the past, if you wanted a custom version of a standard menu (for example File or Edit) you would have to create the menu completely from scratch, writing your own programming for every standard command in the menu. This is no longer required – you can now customize standard menu items on a line by line basis – for example adding an extra command or two in the File menu above the Print command. See the standardfilemenu( function to learn how this is done.
Inside Baseball: Starting with this version, all of Panorama’s standard menus (and context menus) are actually created using Live Menus. This means it’s super easy for me to change menu configuration. In fact, at some point (probably not version 1.0) I may add a user interface for users to create their own custom menu setup. I originally wasn’t planning to include Panorama 6’s “classic menu” option, but now I probably will.
Import
Text import is now supported. The import feature should be more robust than previous versions of Panorama. One change is the CSV parser, which is much more robust and should be able to handle anything you throw at it. Previous versions of Panorama would look at the first line of imported data to see how many columns were there – this new version will add new fields as necessary to accomodate all of the fields in the imported text (of course this feature can be turned off). You also have more control over the importer – for example you can customize the separators (if the separator is not explicitly specified, it will still auto-detect between tabs and commas).
One change you will notice – import is now done through the import statement instead of the openfile statement, and importusing is now an option to the import statement instead of being separate. So procedures that import data will need to be tweaked a bit.
The improved CSV parser is also available separately – the csvtotsv( function will take comma separated text and convert it to tab separated text, with proper handling for quoted fields. The importline statement allows you to import a single line of data.
The import statement does not handle HTML tables, this may be added in the future, or may be a separate statement or function.
New Statements and Functions
Over 300 additional statements and functions have been implemented in this version (see below for the complete list). This sounds great, but unfortunately there are still hundreds more to go :( This version does include for the first time a couple of custom statement libraries, but these are invisible to you (unless you go poking around in the application bundle). So far only a handful of custom statements are defined, but obviously this number will go up rapidly in future versions.
Procedure Mode
Earlier I stated that this new version of Panorama would not have procedure mode. Well, I changed my mind, sort of. There is no mode, but you can set up both spreadsheet style formulas and a procedure for each field! It’s the best of both worlds. When transferring from a Panorama 6 database, the contents of the Panorama 6 field’s formula are automatically moved into the field procedure (with the new formula left blank). This may require some tweaking. In Panorama 6 and earlier, procedure mode could look like this:
field=formula
field=formula
procedurename
The last line could be a procedure name, which would be called. If you do this, it needs to be changed like this:
field=formula
field=formula
call procedurename
In fact, you may now use any valid procedure, complete with if’s, subroutine calls, assignments – whatever you like. In the past, procedure mode wasn’t really a procedure, but just sort of “procedure like”, but now, it literally allows you to assign a procedure to be run whenever a field is modified. (You can also set up spreadsheet formulas, if both are specified the spreadsheet formulas will run first, then the procedure.)
Permanent Variables
Since saving is implemented, naturally permanent variables have also been implemented. They work exactly the same as in Panorama 6.
Full Screen Mode
Works pretty much as you would expect.
Procedure Errors in View and Action Menus
This is kind of cool – you can now see at a glance any procedures that have errors. If a procedure has an error, a red circle with an exclamation point will appear in the menu next to the procedure name.
Encryption
The encrypt( function encrypts data using AES-256 encryption, the decrypt( function decrypts it. AES-256 is considered state of the art encryption (for whatever that is worth these days). In future versions you’ll be able to encrypt all or part of your database using AES-256 (for example the data, or the procedures, or both).
You can now export forms and procedures (using the exportform( and exportprocedure( function as separate entities, and then import them later into the same or a different database. You could, for example, use this feature to update some or all of a database’s forms and procedures while leaving the data untouched. (The new Panorama database format actually stores forms and procedures separately from the data, but at this time I am not recommending manipulating these files directly.)
By the way, the New Form command in the View menu now works. (By the way, the View menu now works somewhat similarly to the View menu in Panorama 6, I’m not sure if that will be retained, modified slightly, or completely replaced. But it works for now.)
Sorted Lookups
As suggested by Dave Thompson, the superlookup( function now has a “wrap” option that can enable huge performance gains when doing lookups between two sorted databases.
That’s All Folks
Well, not really – there are other little gems if you peruse the detailed list below. Did I mention that you can send actions to the current Cocoa first responder? Yeah, that’s too technical, but really cool, take my word for it. See sendaction and menuitem(.
Brand new features implemented in this release (features that were not included in Panorama 6):
- alphabeticnumber( -- The alphabeticnumber( function converts a number into letters: A, B, C, etc.
- appledayzero( -- The appledayzero( function returns an internal constant used for converting between superdates and regular dates.
- arrayhack( -- The arrayhack( function hacks an array by adding, replacing or removing array elements
- bundleresourcepath( -- The bundleresourcepath( function returns the file path and name of a specified item in the Panorama application bundle.
- commalist( -- The commalist( function converts a text array (see Text Arrays) into an English list, with items separated by a comma and a space, except for the last two items which are separated by the word and and spaces.
- decrypt( -- The decrypt( function decrypts data.
- encrypt( -- The encrypt( function encrypts data.
- exportform( -- The exportform( function exports a form and the form's meta data as a binary object that can be imported with the importform statement.
- exportprocedure( -- The exportprocedure( function exports a procedure and the procedure's meta data as a binary object that can be imported with the importprocedure statement.
- htmltablerow( -- The htmltablerow( function extracts the data from a row in an HTML table.
- importform -- The importform statement imports a form into a database.
- importprocedure -- The importprocedure statement imports a procedure into a database.
- info("magnification") -- The info("magnification") function returns the current magnification of the current form.
- info("menuidentifier") -- The info("menuidentifier") function returns the identifier of the most recently chosen menu item (if any).
- menuitem( -- The menuitem( function creates a single menu item (see Custom Menus).
- menuseparator( -- The menuseparator( function generates a menu item separator
- pathseparator( -- The pathseparator( function returns the type of separator character used in a file path (either / or :).
- rawtags( -- The rawtags( function is an internal function used by other tag functions.
- sendaction -- The sendaction statement sends an action message to the Cocoa responder chain.
- standardactionmenu( -- The standardactionmenu( function generates a Custom Menu specification for Panorama's standard Action menu.
- standardfieldsmenu( -- The standardfieldsmenu( function generates a customizable Custom Menu specification for Panorama's standard Fields menu.
- standardhelpmenu( -- The standardhelpmenu( function generates a customizable Custom Menu specification for Panorama's standard Help menu.
- standardpanoramamenu( -- The standardpanoramamenu( function generates a Custom Menu specification for Panorama's standard Panorama menu.
- standardrecordsmenu( -- The standardrecordsmenu( function generates a customizable Custom Menu specification for Panorama's standard Records menu.
- standardwizardsmenu( -- The standardwizardsmenu( function generates a Custom Menu specification for Panorama's standard Wizards menu.
- startdatabasechange -- The startdatabasechange statement adds undo support to a procedure.
- statename( -- The statename( function converts a two letter abbreviation for a US state into the full state name.
Features implemented in this release that work differently than they did in Panorama 6.
- alert -- The alert statement displays a modal alert window with a message and one or more buttons.
- alertcanceldelete -- The alertcanceldelete statement displays a modal alert window with a message and two buttons: Cancel and Delete.
- alertcancelok -- The alertcancelok statement displays a modal alert window with a message and two buttons: Cancel and Ok.
- alertdeletecancel -- The alertdeletecancel statement displays a modal alert window with a message and two buttons: Delete and Cancel.
- alertnoyes -- The alertnoyes statement displays a modal alert window with a message and two buttons: No and Yes.
- alertok -- The alertok statement displays a modal alert window with a message and one button: Ok
- alertokcancel -- The alertokcancel statement displays a modal alert window with a message and two buttons: Ok and Cancel.
- alertoksmall -- The alertoksmall statement displays a modal alert window with a message and one button: Ok
- alertrevertcancel -- The alertrevertcancel statement displays a modal alert window with a message and two buttons: Revert and Cancel.
- alertsavecancel -- The alertsavecancel statement displays a modal alert window with a message and two buttons: Save and Cancel.
- alertyesnocancel -- The alertyesnocancel statement displays a modal alert window with a message and three buttons: Yes, No and Cancel.
- arrayboth( -- The arrayboth( function creates a new array from two arrays. The new array contains only items that are in both of the original arrays.
- arrayboth -- The arrayboth statement creates a new array from two existing arrays. The new array contains only items that are in both of the original arrays.
- arraycontains( -- The arraycontains( function checks to see if any element of a text array or a data array matches a specified value.
- arraydeduplicate -- The arraydeduplicate statement removes duplicate elements from an array (see Text Arrays).
- arraydeletevalue( -- The arraydeletevalue( function deletes any array elements that match the value parameter. This must be an exact match, including upper and lower case. If the value occurs multiple times in the array, every occurence of the value will be removed, with one exception: if the value occurs in two consecutive array elements, only the first occurence will be deleted.
- arraydifference( -- The arraydifference( function creates a new array from two existing text arrays. The new array contains only items that are in the first array but not in the second array.
- arraydifference -- The arraydifference statement creates a new array from two existing text arrays. The new array contains only items that are in the first array but not in the second array.
- arrayfilter -- The arrayfilter statement processes each element of an array with a formula (see Text Arrays).
- arrayfirst( -- The arrayfirst( function extracts the first element of a text array.
- arrayintegersort -- The arrayintegersort statement sorts all the numeric elements of a text array in proper numeric order.
- arrayitemsandwich( -- The arrayitemsandwich( function adds a prefix and/or suffix to each non-blank item in a text array.
- arraymenuitems( -- The arraymenuitems( function converts a carriage return delimited array into a series of menu items.
- arraynotcontains( -- The arraynotcontains( function is the reverse of arraycontains(. it returns false if the value is in the array, true if it is not in the array.
- arraynumericsort( -- The arraynumericsort( function sorts a text array in numeric order (see Text Arrays).
- arraynumericsort -- The arraynumericsort statement sorts all the numeric elements of a text array in proper numeric order.
- arrayreplacevalue( -- The arrayreplacevalue( function changes array elements that match a specified value.
- bit( -- The bit( function converts a bit number (1 to 64) into a number (1, 2, 4, 8, 16, etc.)
- bytearray( -- The bytearray( function extracts a value from an array of bytes (see [Binary Data]).
- cancelok -- The cancelok statement displays a modal alert window with a message and two buttons: Cancel and Ok.
- case -- The case statement allows multiple decisions to be chained together (also see the elseif statement).
- checkedarraymenuitems( -- The checkedarraymenuitems( function converts a carriage return delimited array into a series of menu items, some of which may be checked.
- csvtotsv( -- The csvtotsv( function converts comma separated text into tab separated text.
- fileexistspath( -- The fileexistspath( function tests to see if a file exists.
- filemenubar -- The filemenubar statement creates a custom menu bar or context menu for the current database (see Custom Menus).
- filetypecreator( -- The filetypecreator( function returns the type and creator code of the specified file (if any).
- getbit( -- The getbit( function returns the value of a bit within a number.
- globalmenubar -- The globalmenubar statement creates a custom menu bar or context menu for all windows (intended only for internal use by ProVUE Development).
- hex( -- The hex( function converts a text item containing a hexadecimal number into a standard number (decimal).
- hexstr( -- The hexstr( function converts a number to text formatted as a hexadecimal number.
- info("datatype") -- The info("datatype") function returns the data type of the current field.
- insertbelow -- The insertbelow statement inserts a new record below the current record.
- LMSL -- is the specification language for Live Menus.
- longlongwordarray( -- The longlongwordarray( function extracts a value from an array of 64 bit longlongwords (see [Binary Data]).
- magnification -- The magnification statement changes the magnification of a form.
- makenewform -- The makenewform statement creates a new form in the current database.
- menu( -- The menu( function creates a menu (see Custom Menus).
- newdatabase -- The newdatabase statement creates a new database.
- noyes -- The noyes statement displays a modal alert window with a message and two buttons: No and Yes.
- nthline( -- The nthline( function extracts the nth line from the text.
- nthword( -- The nthword( function extracts a word from the middle of the text.
- okcancel -- The okcancel statement displays a modal alert window with a message and two buttons: Ok and Cancel.
- posixpath( -- The posixpath( function converts a path and filename into a POSIX path that can be used as a parameter to a shell command.
- randominteger( -- The randominteger( function generates a random integer between the starting and ending values.
- setbit( -- The setbit( function sets or clears one bit within a number, without disturbing any of the other bits.
- standardclassicsetupmenu( -- The standardclassicsetupmenu( function generates a customizable Custom Menu specification for Panorama's classic Setup menu.
- standardeditmenu( -- The standardeditmenu( function generates a customizable Custom Menu specification for Panorama's standard Edit menu.
- standardfilemenu( -- The standardfilemenu( function generates a customizable Custom Menu specification for Panorama's standard File menu.
- standardsearchmenu( -- The standardsearchmenu( function generates a customizable Custom Menu specification for Panorama's standard Search menu.
- standardsetupmenu( -- The standardsetupmenu( function generates a customizable Custom Menu specification for Panorama's standard Setup menu.
- standardsortmenu( -- The standardsortmenu( function generates a customizable Custom Menu specification for Panorama's standard Sort menu.
- standardtextmenu( -- The standardtextmenu( function generates a customizable Custom Menu specification for Panorama's standard Text menu.
- standardwindowmenu( -- The standardwindowmenu( function generates a customizable Custom Menu specification for Panorama's standard Window menu.
- stopalert -- The stopalert statement displays a modal alert window with a warning icon, a message and one or more buttons.
- submenu( -- The submenu( function creates a submenu (see Custom Menus).
- tabarray( -- The tabarray( function extracts the nth element from a tab delimited array.
- trimleft( -- The trimleft( function removes one or more characters from the left edge of the text.
- unixshellstring( -- The unixshellstring( function encodes text for use as a parameter to a unix shell command.
- windowmenubar -- The windowmenubar statement creates a custom menu bar or context menu for the current window (see Custom Menus).
- wordarray( -- The wordarray( function extracts a value from an array of 16 bit words (see Binary Data).
- yesno -- The yesno statement displays a modal alert window with a message and two buttons: Yes and No.
Features implemented in this release that work exactly the same as they did in Panorama 6.
- adjustxy( -- The adjustxy( function adjusts the four corners of a rectangle. However, only corners that are inside a boundary are adjusted. Corners outside the boundary are left alone.
- after( -- The after( function extracts all text after a specified tag (sequence of characters).
- age( -- The age( function calculates a person's current age (in years) from their birthdate.
- applescriptconstant( -- The applescriptconstant( function converts an expression into an AppleScript literal.
- applescriptstring( -- The applescriptstring( function converts text into an AppleScript string literal.
- arrayitemtrim( -- The arrayitemtrim( function removes characters from the beginning and/or end of each item in an array.
- arraylast( -- The arraylast( function extracts the last element of an array.
- arraylefttrim( -- The arraylefttrim( function removes one or more elements from the beginning of an array.
- arrayreverselookup( -- The arrayreverselookup( function uses a value to look up a key in a two dimensional text array containing key/value pairs (see Text Arrays).
- arraysort -- The arraysort statement sorts the elements in an array (see Text Arrays).
- arraystrip -- The arraystrip statement strips blank elements from an array.
- arraytoggle -- The arraytoggle statement "toggles" a value within an array.
- arraytopythonlist( -- The arraytopythonlist( function converts a Panorama array into a Python list.
- arraytrim( -- The arraytrim( function removes one or more elements from the end of an array.
- beep -- The beep statement makes the computer speaker beep once.
- before( -- The before( function extracts all text before a specified tag (sequence of characters). If the tag doesn't exist the function returns "".
- between( -- The between( function checks to see if a value is between two other values.
- black( -- The black( function returns black as a Panorama color value (see Colors).
- boolstr( -- The boolstr( function converts a Boolean value to text, either `"true"` or `"false"`.
- cardtype( -- The cardtype( function returns the credit card type (American Express, Visa, MasterCard or Discover).
- chararray( -- The chararray( function extracts a single character from text.
- chunkarray( -- The chunkarray( function extracts a binary "chunk" from binary data (see Binary Data).
- clear -- The clear statement deletes the contents of the current cell without touching the clipboard.
- commastr( -- The commastr( function converts a number to text, with a comma every third digit. The number is converted as an integer, with no decimal point.
- commatocr( -- The commatocr( function converts a comma delimited array into a carriage return delimited array.
- completedatestr( -- The completedatestr( function converts a date to text, spelling out the month and including the day of the week.
- concatenate( -- The concatenate( function concatenates two text strings (same as the + operator).
- connect( -- The connect( function appends a prefix and suffix together with a connector in between.
- console -- The console statement sends a message to the console log.
- copy -- The copy statement copies the contents of the current field onto the clipboard.
- copyrecord -- The copyrecord statement copies the contents of the current record onto the clipboard.
- cr( -- The cr( function generates a carriage return.
- crlf( -- The crlf( function generates a carriage return line feed.
- crtovtab( -- The crtovtab( function converts carrige returns (ASCII 0x0D) into vertical tabs (ASCII 0x0B).
- cut -- The cut statement deletes the contents of the current field, copying it onto the clipboard.
- cutrecord -- The cutrecord statement copies the current record to the clipboard and deletes it.
- datestr( -- The datestr( function converts a date to text using format mm/dd/yy.
- daystr( -- The daystr( function converts a date to the day of the week (for example Sunday).
- dayvalue( -- The dayvalue( function extracts the day from a date as a numeric value.
- dbcheckopen( -- The dbcheckopen( function returns true if the specified database is currently open, false if it is not.
- dbfolder( -- The dbfolder( function returns the folder path of the folder the current database is located in.
- dbname( -- The dbname( function returns the name of the current database.
- dbpath( -- The dbpath( function returns the HFS path of the folder the current database is located in.
- dbsubfolder( -- The dbsubfolder( function returns the path of a subfolder within the same folder as the current database.
- defaultcase -- The defaultcase statement works together with the case statement to specify statements that will be executed if none of the case statements are true.
- defaulttext( -- The defaulttext( function returns a text value, or returns a default value if the text value is empty ("").
- degreestoradians( -- The degreestoradians( function converts an angle from degrees into radians
- deleteall -- The deleteall statement removes all records, leaving a single blank record.
- dollarsandcents( -- The dollarsandcents( function converts a number to text formatted as dollars and cents.
- emptydatabase( -- The emptydatabase( function returns true if the current database is completely blank.
- emptyline( -- The emptyline( function returns true if the entire current record (all fields) is blank, otherwise it is false.
- endcase -- The endcase statement marks the end of statements controlled by a previoius case statement.
- eurodatestr( -- The eurodatestr( function converts a date to text in European format.
- false( -- The false( function returns false.
- feetandframes( -- The feetandframes( function takes an integer and returns a feet and frame count for 35mm film.
- fileextension( -- The fileextension( function extracts the extension (if any) from a partial or complete path and filename.
- filefolder( -- The filefolder( function returns the folder ID of the folder that contains the specified file.
- filename( -- The filename( function extracts the filename from a complete path and filename.
- filepath( -- The filepath( function extracts the path from a combined path and filename.
- firstline( -- The firstline( function extracts the first line from the text.
- firstword( -- The firstword( function extracts the first word from the text.
- fixedwidth( -- The fixedwidth( function makes the text a fixed width, padding with spaces if necessary.
- fixedwidthright( -- The fixedwidthright( function makes the text a fixed width, padding on the left with spaces if necessary.
- foldercontains( -- The foldercontains( function checks to see if a folder contains a specified file. See also the pathcontains( function.
- foldersepchar( -- The foldersepchar( function returns the separator character used between folders.
- formatphone( -- The formatphone( function formats a US phone number using the standard *(aaa) nnn-nnnn* format.
- fullpath( -- The fullpath( function converts a filename or relative path (starting with the : or / symbol) into a full HFS path, including the disk name.
- gray( -- The gray( function returns a shade of gray as a Panorama color value (see Colors).
- hexbyte( -- The hexbyte( function converts a limited range of decimal numbers to a two-digit hexadecimal number expressed as a text string.
- hexlong( -- The hexlong( function converts a decimal number to an eight-digit hexadecimal number expressed as a text string
- hexword( -- The hexword( function converts a decimal number to a four-digit hexadecimal number expressed as a text string.
- htmlbold( -- The htmlbold( function takes the text and adds `` and `` tags to it.
- htmlitalic( -- The htmlitalic( function takes the text and adds `` and `` tags to it.
- htmlrgb( -- The htmlrgb( function converts text formatted as an HTML color into a Panorama color value (see Colors).
- htmlrgbstr( -- The htmlrgbstr( function converts a color to text formatted as an HTML color.
- htmltablecell( -- The htmltablecell( function extracts the data from a cell in an HTML table.
- htmltablecellexists( -- The htmltablecellexists( function returns true if an HTML table contains the specified cell, false if it doesn't.
- htmltablecellraw( -- The htmltablecellraw( function extracts the data from a cell in an HTML table (including tags, if any).
- htmltableheight( -- The htmltableheight( function calculates the height (number of rows) in an HTML table.
- htmltablerowraw( -- The htmltablerowraw( function extracts the raw data (including tags, if any) from a row in an HTML table.
- htmltablewidth( -- The htmltablewidth( function calculates the width (number of columns) in an HTML table.
- importcell( -- The importcell( function returns one cell of imported data.
- info("foldersepchar") -- The info("foldersepchar") function returns the separator character used between folders.
- info("formname") -- The info("formname") function returns the name of the current form.
- info("panoramabuild") -- The info("panoramabuild") function returns the date and time when Panorama was compiled (as a SuperDate).
- info("windowtype") -- The info("windowtype") function returns a numeric value based on what type of view the current window contains.
- info("windowview") -- The info("windowview") function determines what type of view the current window contains.
- kcadd( -- The kcadd( function takes a keycode for 35mm film and adds a number of frames to it and returns a keycode as a string.
- kcdiff( -- The kcdiff( function calculates the number of frames between two frames of 35mm film, using inclusive counts (submitted by chris watts)
- kcframes( -- The kcframes( function returns an integer based on a feet and frames count for 35mm film.
- kcoutfromlength( -- The kcoutfromlength( function answers the question "what will the last frame be if i start my cut at the incode and my shot is some number of frames long"?
- lastline( -- The lastline( function extracts the last line from the text.
- lastword( -- The lastword( function extracts the last word from the text.
- left( -- The left( function extracts characters from the left edge of the text.
- lf( -- The lf( function generates a line feed.
- limit( -- The limit( function checks to see if a value is between a minimum and maximum value. If it is, the value is returned unchanged. If it is below the minimum, the minimum value is returned. If it is above the maximum the maximum value is returned.
- linecount( -- The linecount( function counts the number of carriage return separated lines in the text.
- linescontain( -- The linescontain( function checks to see if any line in a carriage return separated array matches the specified value.
- linesnotcontain( -- The linesnotcontain( function is the reverse of the linescontain( function.
- linestrip( -- The linestrip( function removes any blank lines from the text.
- listpanoramafiles( -- The listpanoramafiles( function returns a list of panorama database files in the specified folder.
- listtextfiles( -- The listtextfiles( function returns a list of text files in the specified folder.
- longdatestr( -- The longdatestr( function converts a date to text by spelling out the month.
- longtimestr( -- The longtimestr( function converts a number to text in am/pm time format, including seconds.
- longwordarray( -- The longwordarray( function extracts a value from an array of 32 bit longwords (see [Binary Data]).
- lookupalldouble( -- The lookupalldouble( function is similar to the lookupall( function, but it returns two fields from the target database instead of just one.
- lookupalloctet( -- The lookupalloctet( function is similar to the lookupall( function, but it returns eight fields from the target database instead of just one.
- lookupallquadruple( -- The lookupallquadruple( function is similar to the lookupall( function, but it returns four fields from the target database instead of just one.
- lookupallquintuplet( -- The lookupallquintuplet( function is similar to the lookupall( function, but it returns five fields from the target database instead of just one.
- lookupallseptuplet( -- The lookupallseptuplet( function is similar to the lookupall( function, but it returns seven fields from the target database instead of just one.
- lookupallsextet( -- The lookupallsextet( function is similar to the lookupall( function, but it returns six fields from the target database instead of just one.
- lookupalltriple( -- The lookupalltriple( function is similar to the lookupall( function, but it returns three fields from the target database instead of just one.
- makeinteger( -- The makeinteger( function makes a random integer with up to the specified # of digits (may be less).
- makesecret -- The makesecret statement makes the current database disappear, while leaving it open in memory.
- mid( -- The mid( function extracts characters from the middle of the text.
- money( -- The money( function converts a number to text, formatted as money.
- monthvalue( -- The monthvalue( function extracts the month from a date as a numeric value.
- notbetween( -- The notbetween( function checks to see if a value is not between two other values.
- nth( -- The nth( function converts a number into an ordinal.
- numsandwich( -- The numsandwich( function is similar to the sandwich function, but for numbers. If the value is zero the result is zero, but if the value is not zero the result is the value plus the extra.
- onescomplement( -- The onescomplement( function returns the one's complement of a 64 bit number (all bits are reversed)
- onespace( -- The onespace( function removes all leading & trailing spaces and any extra spaces between words, so that there is exactly one and only one space between each word.
- onewhitespace( -- The onewhitespace( function removes all leading spaces and any extra whitespace between words, making sure that there is one and only one space between each word.
- os9( -- The os9( function returns true if running on OS 9.
- oswindows( -- The oswindows( function returns true if running on Microsoft Windows, otherwise false
- osx( -- The osx( function returns true if running on OS X, otherwise false
- outcode( -- The outcode( function adds one frame to a timecode.
- padzero( -- The padzero( function makes the text a fixed width, padding on the left with zeros if necessary.
- paste -- The paste statement pastes the contents of the clipboard into the current field.
- pasterecord -- The pasterecord statement inserts a new record containing the contents of the clipboard.
- pathcontains( -- The pathcontains( function checks to see if a folder contains a specified file (or folder).
- pathcontents( -- The pathcontents( function lists the contents of a folder (specified by a path)
- pathexists( -- The pathexists( function checks to see if a path exists.
- perlconstant( -- The perlconstant( function encodes text for use as a constant in a Perl program.
- perlscriptstring( -- The perlscriptstring( function converts text into a Perl string literal.
- phpconstant( -- The phpconstant( function encodes text for use as a contant in a php program.
- places( -- The places( function converts a number to text with a specific number of places after the decimal point.
- pythonconstant( -- The pythonconstant( function encodes text for use as a constant in a python program.
- quartervalue( -- The quartervalue( function extracts the quarter from a date as a numeric value.
- quoted( -- The quoted( function returns a quoted version of the supplied text.
- radianstodegrees( -- The radianstodegrees( function converts an angle from radians to degrees.
- randomletter( -- The randomletter( function returns a random letter.
- rangecontains( -- The rangecontains( function checks to see if the text contains any characters in the specified range.
- rangematch( -- The rangematch( function returns true (-1) if the text matches a specified range.
- rangenotmatch( -- The rangenotmatch( function returns false (0) if the text matches a specified range.
- rectanglesizestr( -- The rectanglesizestr( function converts a rectangle into text in the format top,left,height,width.
- rectanglestr( -- The rectanglestr( function converts a rectangle into text in the format top,left,bottom,right.
- removeprefix( -- The removeprefix( function checks to see if a text item starts with a prefix. if it does, the prefix is removed.
- removeselected -- The removeselected statement deletes all selected records from the database.
- removesuffix( -- The removesuffix( function checks to see if a text item ends with a suffix. if it does, the suffix is removed.
- rgbstr( -- The rgbstr( function converts a color into text in the format red,green,blue.
- right( -- The right( function extracts characters from the right edge of the text.
- rubyconstant( -- The rubyconstant( function encodes a value for use as a constant in a Ruby program.
- save -- The save statement saves the database to disk.
- scientificnotation( -- The scientificnotation( function converts a number to text, formatted in scientific notation.
- secsminshours( -- The secsminshours( function this converts a time (number of seconds) into an approximate text value.
- selectreverse -- The selectreverse statement makes every visible record invisible, and every invisible record visible.
- setrectangleheight( -- The setrectangleheight( function changes the height of a rectangle, leaving the width unchanged.
- setrectanglesize( -- The setrectanglesize( function changes the height and width of a rectangle, leaving the position of the top left hand corner unchanged.
- setrectanglewidth( -- The setrectanglewidth( function changes the width of a rectangle, leaving the height unchanged.
- snip( -- The snip( function removes (snips!) one or more characters from the middle of an item of text.
- standardviewmenu( -- The standardviewmenu( function generates a Custom Menu specification for Panorama's standard View menu.
- stateabbreviations( -- The stateabbreviations( function returns a list of US state abbreviations.
- statelookup( -- The statelookup( function converts a two letter abbreviation for a US state into the full state name.
- striphtmltags( -- The striphtmltags( function removes all HTML tags from the text.
- subfolder( -- The subfolder( function returns the folder id of a subfolder of a specified folder
- subpath( -- The subpath( function returns the HFS path of a subfolder of a specified folder.
- superdatepattern( -- The superdatepattern( function converts a number containing a superdate to text, allowing you to specify the patterns for both the date and the time conversion to text.
- superdatesecondsstr( -- The superdatesecondsstr( function converts a number containing a superdate to text, including the seconds.
- superdatestr( -- The superdatestr( function converts a number containing a superdate (date + time) to text.
- supernow( -- The supernow( function returns the number representing the current date and time as a superdate.
- tagstrip( -- The tagstrip( function removes tags (usually HTML tags) from within a piece of text.
- tc24to30( -- The tc24to30( function converts 24 frame timecode to 30 frame non-drop timecode.
- tc30to24( -- The tc30to24( function converts 30 frame non-drop timecode to 24 frame timecode.
- tcadd( -- The tcadd( function accepts a timecode as text, and adds some number of frames, returns a timecode string.
- tcdiff( -- The tcdiff( function calculates the number of frames between two timecodes.
- tcframes( -- The tcframes( function returns a number of frames from zero of a 24fps, 25fps, or 30fps timecode.
- textafter( -- The textafter( function extracts the text after the tag.
- textbefore( -- The textbefore( function extracts the text before the tag.
- texttimedifference( -- The texttimedifference( function allows time math to be performed on text values.
- texttimeinterval( -- The texttimeinterval( function allows time math to be performed on text values.
- timecode( -- The timecode( function returns a timecode string corresponding to an integer.
- timestr( -- The timestr( function converts a number to text in am/pm time format.
- trim( -- The trim( function removes characters from the right edge of the text.
- trimstart( -- The trimstart( function removes one or more characters from the start of the text.
- true( -- The true( function returns true.
- undefine -- The undefine statement destroys one or more variables.
- unixshellpath( -- The unixshellpath( function converts a path and filename into a POSIX path that can be embedded within the shellscript statement.
- urlfilename( -- The urlfilename( function extracts the filename from a complete url.
- urlpath( -- The urlpath( function extracts the path from a URL.
- uspssecondaryunits( -- The uspssecondaryunits( function returns a list of USPS (United States Postal Service) secondary suffix designation abbreviations.
- uspsstreetsuffixes( -- The uspsstreetsuffixes( function returns a list of USPS street suffix abbreviations.
- vtab( -- The vtab( function generates a vertical tab.
- vtabtocr( -- The vtabtocr( function converts vertical tabs (ASCII 0x0B) into carrige returns (ASCII 0x0D).
- weekvalue( -- The weekvalue( function extracts the week from a date as a numeric value.
- white( -- The white( function returns white as a Panorama color value (see Colors).
- window( -- The window( function returns the name of the current window.
- wordcount( -- The wordcount( function returns the number of words in the text.
- xtag( -- The xtag( function generates an HTML/XML tag.
- xtagvalue( -- The xtagvalue( function extracts the text from the first matching HTML or XML tag.
- years( -- The years( function converts a number of days into a number of years.
- yearsbetween( -- The yearsbetween( function calculates the number of years between two dates.
- yearvalue( -- The yearvalue( function extracts the year from a date as a numeric value.
- yoke( -- The yoke( function appends two text items together, with a joiner between them if both are non-blank.
- zbpattern( -- The zbpattern( function converts a number to text using a pattern, but returns empty text if the number is zero.
ALL features that were added or changed in this release:
- after( -- The after( function extracts all text after a specified tag (sequence of characters).
- alertdeletecancel -- The alertdeletecancel statement displays a modal alert window with a message and two buttons: Delete and Cancel.
- alertnoyes -- The alertnoyes statement displays a modal alert window with a message and two buttons: No and Yes.
- alertok -- The alertok statement displays a modal alert window with a message and one button: Ok
- alertokcancel -- The alertokcancel statement displays a modal alert window with a message and two buttons: Ok and Cancel.
- alertoksmall -- The alertoksmall statement displays a modal alert window with a message and one button: Ok
- alertrevertcancel -- The alertrevertcancel statement displays a modal alert window with a message and two buttons: Revert and Cancel.
- alertsavecancel -- The alertsavecancel statement displays a modal alert window with a message and two buttons: Save and Cancel.
- alertyesnocancel -- The alertyesnocancel statement displays a modal alert window with a message and three buttons: Yes, No and Cancel.
- alphabeticnumber( -- The alphabeticnumber( function converts a number into letters: A, B, C, etc.
- arraydifference -- The arraydifference statement creates a new array from two existing text arrays. The new array contains only items that are in the first array but not in the second array.
- arrayitemtrim( -- The arrayitemtrim( function removes characters from the beginning and/or end of each item in an array.
- arrayreverselookup( -- The arrayreverselookup( function uses a value to look up a key in a two dimensional text array containing key/value pairs (see Text Arrays).
- arraystrip -- The arraystrip statement strips blank elements from an array.
- arraytrim( -- The arraytrim( function removes one or more elements from the end of an array.
- bit( -- The bit( function converts a bit number (1 to 64) into a number (1, 2, 4, 8, 16, etc.)
- black( -- The black( function returns black as a Panorama color value (see Colors).
- boolstr( -- The boolstr( function converts a Boolean value to text, either `"true"` or `"false"`.
- bytearray( -- The bytearray( function extracts a value from an array of bytes (see [Binary Data]).
- cancelok -- The cancelok statement displays a modal alert window with a message and two buttons: Cancel and Ok.
- chunkarray( -- The chunkarray( function extracts a binary "chunk" from binary data (see Binary Data).
- commatocr( -- The commatocr( function converts a comma delimited array into a carriage return delimited array.
- concatenate( -- The concatenate( function concatenates two text strings (same as the + operator).
- connect( -- The connect( function appends a prefix and suffix together with a connector in between.
- copyrecord -- The copyrecord statement copies the contents of the current record onto the clipboard.
- crlf( -- The crlf( function generates a carriage return line feed.
- crtovtab( -- The crtovtab( function converts carrige returns (ASCII 0x0D) into vertical tabs (ASCII 0x0B).
- cut -- The cut statement deletes the contents of the current field, copying it onto the clipboard.
- cutrecord -- The cutrecord statement copies the current record to the clipboard and deletes it.
- datestr( -- The datestr( function converts a date to text using format mm/dd/yy.
- daystr( -- The daystr( function converts a date to the day of the week (for example Sunday).
- dayvalue( -- The dayvalue( function extracts the day from a date as a numeric value.
- dbcheckopen( -- The dbcheckopen( function returns true if the specified database is currently open, false if it is not.
- dbname( -- The dbname( function returns the name of the current database.
- dbpath( -- The dbpath( function returns the HFS path of the folder the current database is located in.
- defaultcase -- The defaultcase statement works together with the case statement to specify statements that will be executed if none of the case statements are true.
- defaulttext( -- The defaulttext( function returns a text value, or returns a default value if the text value is empty ("").
- degreestoradians( -- The degreestoradians( function converts an angle from degrees into radians
- deleteall -- The deleteall statement removes all records, leaving a single blank record.
- dollarsandcents( -- The dollarsandcents( function converts a number to text formatted as dollars and cents.
- emptydatabase( -- The emptydatabase( function returns true if the current database is completely blank.
- emptyline( -- The emptyline( function returns true if the entire current record (all fields) is blank, otherwise it is false.
- endcase -- The endcase statement marks the end of statements controlled by a previoius case statement.
- exportprocedure( -- The exportprocedure( function exports a procedure and the procedure's meta data as a binary object that can be imported with the importprocedure statement.
- false( -- The false( function returns false.
- feetandframes( -- The feetandframes( function takes an integer and returns a feet and frame count for 35mm film.
- fileexistspath( -- The fileexistspath( function tests to see if a file exists.
- fileextension( -- The fileextension( function extracts the extension (if any) from a partial or complete path and filename.
- filename( -- The filename( function extracts the filename from a complete path and filename.
- filepath( -- The filepath( function extracts the path from a combined path and filename.
- filetypecreator( -- The filetypecreator( function returns the type and creator code of the specified file (if any).
- firstline( -- The firstline( function extracts the first line from the text.
- firstword( -- The firstword( function extracts the first word from the text.
- fixedwidth( -- The fixedwidth( function makes the text a fixed width, padding with spaces if necessary.
- fixedwidthright( -- The fixedwidthright( function makes the text a fixed width, padding on the left with spaces if necessary.
- foldersepchar( -- The foldersepchar( function returns the separator character used between folders.
- getbit( -- The getbit( function returns the value of a bit within a number.
- globalmenubar -- The globalmenubar statement creates a custom menu bar or context menu for all windows (intended only for internal use by ProVUE Development).
- gray( -- The gray( function returns a shade of gray as a Panorama color value (see Colors).
- hexstr( -- The hexstr( function converts a number to text formatted as a hexadecimal number.
- htmlrgb( -- The htmlrgb( function converts text formatted as an HTML color into a Panorama color value (see Colors).
- htmltableheight( -- The htmltableheight( function calculates the height (number of rows) in an HTML table.
- htmltablewidth( -- The htmltablewidth( function calculates the width (number of columns) in an HTML table.
- info("datatype") -- The info("datatype") function returns the data type of the current field.
- info("foldersepchar") -- The info("foldersepchar") function returns the separator character used between folders.
- info("formname") -- The info("formname") function returns the name of the current form.
- info("magnification") -- The info("magnification") function returns the current magnification of the current form.
- info("panoramabuild") -- The info("panoramabuild") function returns the date and time when Panorama was compiled (as a SuperDate).
- info("screenrectangle") -- The info("screenrectangle") function returns a rectangle defining the edges of the main screen.
- info("windowtype") -- The info("windowtype") function returns a numeric value based on what type of view the current window contains.
- info("windowview") -- The info("windowview") function determines what type of view the current window contains.
- insertbelow -- The insertbelow statement inserts a new record below the current record.
- kcadd( -- The kcadd( function takes a keycode for 35mm film and adds a number of frames to it and returns a keycode as a string.
- kcdiff( -- The kcdiff( function calculates the number of frames between two frames of 35mm film, using inclusive counts (submitted by chris watts)
- kcframes( -- The kcframes( function returns an integer based on a feet and frames count for 35mm film.
- kcoutfromlength( -- The kcoutfromlength( function answers the question "what will the last frame be if i start my cut at the incode and my shot is some number of frames long"?
- lastword( -- The lastword( function extracts the last word from the text.
- left( -- The left( function extracts characters from the left edge of the text.
- lf( -- The lf( function generates a line feed.
- linescontain( -- The linescontain( function checks to see if any line in a carriage return separated array matches the specified value.
- linestrip( -- The linestrip( function removes any blank lines from the text.
- listtextfiles( -- The listtextfiles( function returns a list of text files in the specified folder.
- LMSL -- is the specification language for Live Menus.
- longdatestr( -- The longdatestr( function converts a date to text by spelling out the month.
- longwordarray( -- The longwordarray( function extracts a value from an array of 32 bit longwords (see [Binary Data]).
- magnification -- The magnification statement changes the magnification of a form.
- makeinteger( -- The makeinteger( function makes a random integer with up to the specified # of digits (may be less).
- mid( -- The mid( function extracts characters from the middle of the text.
- money( -- The money( function converts a number to text, formatted as money.
- monthvalue( -- The monthvalue( function extracts the month from a date as a numeric value.
- newdatabase -- The newdatabase statement creates a new database.
- nthword( -- The nthword( function extracts a word from the middle of the text.
- numsandwich( -- The numsandwich( function is similar to the sandwich function, but for numbers. If the value is zero the result is zero, but if the value is not zero the result is the value plus the extra.
- okcancel -- The okcancel statement displays a modal alert window with a message and two buttons: Ok and Cancel.
- onescomplement( -- The onescomplement( function returns the one's complement of a 64 bit number (all bits are reversed)
- onespace( -- The onespace( function removes all leading & trailing spaces and any extra spaces between words, so that there is exactly one and only one space between each word.
- oswindows( -- The oswindows( function returns true if running on Microsoft Windows, otherwise false
- osx( -- The osx( function returns true if running on OS X, otherwise false
- outcode( -- The outcode( function adds one frame to a timecode.
- paste -- The paste statement pastes the contents of the clipboard into the current field.
- pasterecord -- The pasterecord statement inserts a new record containing the contents of the clipboard.
- pathcontains( -- The pathcontains( function checks to see if a folder contains a specified file (or folder).
- pathcontents( -- The pathcontents( function lists the contents of a folder (specified by a path)
- pathexists( -- The pathexists( function checks to see if a path exists.
- pathseparator( -- The pathseparator( function returns the type of separator character used in a file path (either / or :).
- perlconstant( -- The perlconstant( function encodes text for use as a constant in a Perl program.
- phpconstant( -- The phpconstant( function encodes text for use as a contant in a php program.
- places( -- The places( function converts a number to text with a specific number of places after the decimal point.
- posixpath( -- The posixpath( function converts a path and filename into a POSIX path that can be used as a parameter to a shell command.
- quartervalue( -- The quartervalue( function extracts the quarter from a date as a numeric value.
- quoted( -- The quoted( function returns a quoted version of the supplied text.
- radianstodegrees( -- The radianstodegrees( function converts an angle from radians to degrees.
- randominteger( -- The randominteger( function generates a random integer between the starting and ending values.
- rangematch( -- The rangematch( function returns true (-1) if the text matches a specified range.
- rawtags( -- The rawtags( function is an internal function used by other tag functions.
- removeprefix( -- The removeprefix( function checks to see if a text item starts with a prefix. if it does, the prefix is removed.
- rgbstr( -- The rgbstr( function converts a color into text in the format red,green,blue.
- right( -- The right( function extracts characters from the right edge of the text.
- save -- The save statement saves the database to disk.
- scientificnotation( -- The scientificnotation( function converts a number to text, formatted in scientific notation.
- standardclassicsetupmenu( -- The standardclassicsetupmenu( function generates a customizable Custom Menu specification for Panorama's classic Setup menu.
- standardsortmenu( -- The standardsortmenu( function generates a customizable Custom Menu specification for Panorama's standard Sort menu.
- standardtextmenu( -- The standardtextmenu( function generates a customizable Custom Menu specification for Panorama's standard Text menu.
- standardwindowmenu( -- The standardwindowmenu( function generates a customizable Custom Menu specification for Panorama's standard Window menu.
- statename( -- The statename( function converts a two letter abbreviation for a US state into the full state name.
- subfolder( -- The subfolder( function returns the folder id of a subfolder of a specified folder
- submenu( -- The submenu( function creates a submenu (see Custom Menus).
- subpath( -- The subpath( function returns the HFS path of a subfolder of a specified folder.
- superdatesecondsstr( -- The superdatesecondsstr( function converts a number containing a superdate to text, including the seconds.
- superdatestr( -- The superdatestr( function converts a number containing a superdate (date + time) to text.
- supernow( -- The supernow( function returns the number representing the current date and time as a superdate.
- tab( -- The tab( function generates a tab.
- tabarray( -- The tabarray( function extracts the nth element from a tab delimited array.
- tc24to30( -- The tc24to30( function converts 24 frame timecode to 30 frame non-drop timecode.
- tc30to24( -- The tc30to24( function converts 30 frame non-drop timecode to 24 frame timecode.
- tcadd( -- The tcadd( function accepts a timecode as text, and adds some number of frames, returns a timecode string.
- tcdiff( -- The tcdiff( function calculates the number of frames between two timecodes.
- tcframes( -- The tcframes( function returns a number of frames from zero of a 24fps, 25fps, or 30fps timecode.
- textafter( -- The textafter( function extracts the text after the tag.
- textbefore( -- The textbefore( function extracts the text before the tag.
- texttimedifference( -- The texttimedifference( function allows time math to be performed on text values.
- texttimeinterval( -- The texttimeinterval( function allows time math to be performed on text values.
- timecode( -- The timecode( function returns a timecode string corresponding to an integer.
- timestr( -- The timestr( function converts a number to text in am/pm time format.
- trim( -- The trim( function removes characters from the right edge of the text.
- trimleft( -- The trimleft( function removes one or more characters from the left edge of the text.
- trimstart( -- The trimstart( function removes one or more characters from the start of the text.
- true( -- The true( function returns true.
- undefine -- The undefine statement destroys one or more variables.
- unixshellpath( -- The unixshellpath( function converts a path and filename into a POSIX path that can be embedded within the shellscript statement.
- unixshellstring( -- The unixshellstring( function encodes text for use as a parameter to a unix shell command.
- uspsstreetsuffixes( -- The uspsstreetsuffixes( function returns a list of USPS street suffix abbreviations.
- vtab( -- The vtab( function generates a vertical tab.
- vtabtocr( -- The vtabtocr( function converts vertical tabs (ASCII 0x0B) into carrige returns (ASCII 0x0D).
- weekvalue( -- The weekvalue( function extracts the week from a date as a numeric value.
- white( -- The white( function returns white as a Panorama color value (see Colors).
- window( -- The window( function returns the name of the current window.
- wordcount( -- The wordcount( function returns the number of words in the text.
- xtag( -- The xtag( function generates an HTML/XML tag.
- xtagvalue( -- The xtagvalue( function extracts the text from the first matching HTML or XML tag.
- yearvalue( -- The yearvalue( function extracts the year from a date as a numeric value.
- yesno -- The yesno statement displays a modal alert window with a message and two buttons: Yes and No.
- yoke( -- The yoke( function appends two text items together, with a joiner between them if both are non-blank.
See Also
- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.009 (released July 9th, 2013) -- Summary of Version 0.1.009 (released 7/9/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.019 (released January 28th, 2016) -- Summary of Version 0.1.019 (released 1/28/2016)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.028 (released November 9th, 2016) -- Summary of Version 0.1.028 (released 11/9/2016)
- Version 0.1.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)
- Version 10.2 (released October 1st, 2024) -- Summary of Version 10.2 (released 10/01/2024)
- Version 10.2.0 b12 (released January 27, 2021) -- Summary of Version 10.2.0 b12 (released 01/27/2021)
- Version 10.2.0 b13 (released February 15, 2021) -- Summary of Version 10.2.0 b13 (released 02/15/2021)
- Version 10.2.0 b14 (released March 14, 2021) -- Summary of Version 10.2.0 b14 (released 03/14/2021)
- Version 10.2.0 b15 (released March 30, 2021) -- Summary of Version 10.2.0 b15 (released 03/30/2021)
- Version 10.2.0 b16 (released April 27, 2021) -- Summary of Version 10.2.0 b16 (released 04/27/2021)
- Version 10.2.0 b17 (released June 23, 2021) -- Summary of Version 10.2.0 b17 (released 06/23/2021)
- Version 10.2.0 b18 (released July 21, 2021) -- Summary of Version 10.2.0 b18 (released 07/21/2021)
- Version 10.2.0 b20 (released August 26, 2021) -- Summary of Version 10.2.0 b20 (released 08/26/2021)
- Version 10.2.0 b21 (released September 20, 2021) -- Summary of Version 10.2.0 b21 (released 09/20/2021)
- Version 10.2.0 b22 (released October 6, 2021) -- Summary of Version 10.2.0 b22 (released 10/06/2021)
- Version 10.2.0 b23 (released October 20, 2021) -- Summary of Version 10.2.0 b23 (released 10/20/2021)
- Version 10.2.0 b24 (released October 21, 2021) -- Summary of Version 10.2.0 b24 (released 10/21/2021)
- Version 10.2.0 b25 (released December 10, 2021) -- Summary of Version 10.2.0 b25 (released 12/10/2021)
- Version 10.2.0 b26 (released June 15, 2022) -- Summary of Version 10.2.0 b26 (released 06/15/2022)
- Version 10.2.0 b27 (released August 11, 2022) -- Summary of Version 10.2.0 b27 (released 08/11/2022)
- Version 10.2.0 b28 (released August 23, 2022) -- Summary of Version 10.2.0 b28 (released 08/23/2022)
- Version 10.2.0 b29 (released September 13, 2022) -- Summary of Version 10.2.0 b29 (released 09/13/2022)
- Version 10.2.0 b30 (released October 30, 2022) -- Summary of Version 10.2.0 b30 (released 10/30/2022)
- Version 10.2.0 b31 (released January 16, 2023) -- Summary of Version 10.2.0 b31 (released 01/16/2023)
- Version 10.2.0 b32 (released January 21, 2023) -- Summary of Version 10.2.0 b32 (released 01/21/2023)
- Version 10.2.0 b33 (released April 30, 2023) -- Summary of Version 10.2.0 b33 (released 04/30/2023)
- Version 10.2.0 b34 (released October 27, 2023) -- Summary of Version 10.2.0 b34 (released 10/27/2023)
- Version 10.2.0 b35 (released December 4, 2023) -- Summary of Version 10.2.0 b35 (released 12/4/2023)
- Version 10.2.0 b36 (released December 25, 2023) -- Summary of Version 10.2.0 b36 (released 12/25/2023)
- Version 10.2.0 b37 (released January 11, 2024) -- Summary of Version 10.2.0 b37 (released 1/11/2024)
- Version 10.2.0 b38 (released April 7, 2024) -- Summary of Version 10.2.0 b38 (released 4/7/2024)
- Version 10.2.0 b39 (released June 26, 2024) -- Summary of Version 10.2.0 b39 (released 06/26/2024)
- Version 10.2.0 b40 (released October 1, 2024) -- Summary of Version 10.2.0_b40 (released 10/01/2024)