{"id":733,"date":"2016-08-21T14:29:19","date_gmt":"2016-08-21T19:29:19","guid":{"rendered":"http:\/\/www.lorenzcom.com\/?p=733"},"modified":"2016-08-22T10:16:54","modified_gmt":"2016-08-22T15:16:54","slug":"plistlib-preference-file-library","status":"publish","type":"post","link":"https:\/\/lorenzcom.com\/?p=733","title":{"rendered":"PlistLib &#8211; Preference File Library"},"content":{"rendered":"<h3>PlistLib<\/h3>\n<p>PlistLib is a free AppleScript library of essential functions to manage preference list files from within AppleScript code.<\/p>\n<p>Use System Events and some &#8220;defaults&#8221; shell script plist commands to manage plist&#8217;s from within AppleScript scripts and applications. Verify, create, modify, and delete plists and their key:value pairs easily with these ready-made routines.<\/p>\n<h4>Library Handlers<\/h4>\n<ul>\n<li><strong>VerifyPlist ( _folder , _file )<\/strong> &#8211; Return plist path. Plist file is created if it does not exist.<\/li>\n<li><strong>CreatePlist ( _folder , _file )<\/strong> &#8211; Create empty plist file and return plist path.<\/li>\n<li><strong>ValidPlistPath ( _folder , _file )<\/strong> &#8211; Return a validly formatted plist path as text.<\/li>\n<li><strong>ValidPlistDomain ( _path )<\/strong> &#8211; Change a plist path to a plist domain &#8211; POSIX path of path and file without the &#8220;.plist&#8221; extension. For use in &#8220;defaults&#8221; shell script commands.<\/li>\n<li><strong>WritePlist ( _path , _thePlist )<\/strong> &#8211; Write a key:value pair according to the value kind:  boolean\/data\/date\/list\/number\/record\/string.<\/li>\n<li><strong>WritePlistValue ( _path , _key , _value )<\/strong> &#8211; Overwrite the plist contents with the passed plist dictionary (AppleScript record). Uses &#8220;defaults&#8221; shell script command.<\/li>\n<li><strong>ReadPlistValue ( _path , _key )<\/strong> &#8211; Return the value associated with the key.<\/li>\n<li><strong>ReadPlistName ( _path , _key )<\/strong> &#8211; Return the name associated with the key.<\/li>\n<li><strong>ReadPlistText ( _path , _key )<\/strong> &#8211; Return the text representation associated with the key.<\/li>\n<li><strong>ReadPlistKind ( _path , _key )<\/strong> &#8211; Return the kind associated with the key.<\/li>\n<li><strong>ReadPlist ( _path )<\/strong> &#8211; Return the entire plist (all of the &#8220;defaults&#8221; for the domain). Uses the &#8220;defaults&#8221; shell script command.<\/li>\n<li><strong>ModifyPlistValue ( _path , _key , _value )<\/strong> &#8211; Modify the value of a plist key:value pair.<\/li>\n<li><strong>ModifyPlistSubValue ( _path , _key , _subKey , _value )<\/strong> &#8211; Modify key:value (_subkey) of a plist key:value (_key).<\/li>\n<li><strong>RenamePlistKey ( _path , _oldKey , _newKey<\/strong> ) &#8211; Renames the old_key to the new_key via &#8220;defaults&#8221; shell script command.<\/li>\n<li><strong>DeletePlistKey ( _path , _Key )<\/strong> &#8211; Removes the key:value pair associated with key from plist.<\/li>\n<li><strong>DeletePlistContents ( _path )<\/strong> &#8211; Removes all defaults information for domain. Uses &#8220;default&#8221; shell script command.<\/li>\n<\/ul>\n<h4>Free AppleScript Library<\/h4>\n<p><strong>PlistLib code:<\/strong> Copy the selected code (click on Select All to highlight all the code) to the clipboard and paste it into a newly created AppleScript document. <a href=\"\/docs\/AppleScript\/PlistLib.scpt\">Download code FREE as a text file from here.<\/a><\/p>\n<form>\n<textarea id=<?php echo '\"te_'.get_the_ID().'\"';?> style=&#8221;width:100%; height:180px; font-family:Arial,Helvetica; font-size:.90em; line-height:normal;&#8221;><!--raw-->&#8211;VERIFY PLIST<br \/>\non VerifyPlist(_folder, _file)<br \/>\n\t&#8211;Called to return the existing property list file else create it and return its path.<br \/>\n\tset _path to ValidPlistPath(_folder, _file)<br \/>\n\ttell application &#8220;Finder&#8221;<br \/>\n\t\t&#8211;if not (exists file (_file &#038; &#8220;.plist&#8221;) of folder prefsFolder) then<br \/>\n\t\tif not (exists file (_path)) then<br \/>\n\t\t\tset _path to my CreatePlist(_folder, _file) &#8211;Create the missing plist automatically.<br \/>\n\t\tend if<br \/>\n\t\treturn _path<br \/>\n\tend tell<br \/>\nend VerifyPlist<\/p>\n<p>&#8211;CREATE PLIST<br \/>\non CreatePlist(_folder, _file)<br \/>\n\t&#8211;Create, overwrite, empty _file at _folder.<br \/>\n\tset _path to ValidPlistPath(_folder, _file)<br \/>\n\ttell application &#8220;System Events&#8221;<br \/>\n\t\t&#8212; create an empty property list dictionary item<br \/>\n\t\tset the _dictionary to make new property list item with properties {kind:record}<br \/>\n\t\t&#8212; create new property list file using the empty dictionary list item as contents<br \/>\n\t\tset the _plistfilePath to _path &#8211;Text of the _path to give to System Events for creation.<br \/>\n\t\tset _plistfile to make new property list file with properties {contents:_dictionary, name:_plistfilePath}<br \/>\n\tend tell<br \/>\n\treturn _plistfile &#8211;Return for use or not in subsequent plist calls.<br \/>\nend CreatePlist<\/p>\n<p>&#8211;VALID PLIST PATH<br \/>\non ValidPlistPath(_folder, _file)<br \/>\n\t&#8211;Create a validly formed plist path in text.<br \/>\n\t&#8211;Plist files will usually reside in preferences folder if no folder is sent.<br \/>\n\tset _folder to _folder as text<br \/>\n\tset _file to _file as text<br \/>\n\tset _path to _folder<br \/>\n\tif _path = &#8220;&#8221; then set _path to path of preferences<br \/>\n\tset _path to _path &#038; _file<br \/>\n\tif (offset of &#8220;.plist&#8221; in _file) is not equal to ((length of _file) &#8211; 5) then set _path to _path &#038; &#8220;.plist&#8221;<br \/>\n\treturn _path as text<br \/>\nend ValidPlistPath<\/p>\n<p>&#8211;VALID DOMAIN<br \/>\non ValidPlistDomain(_path)<br \/>\n\t&#8211;Change a plist path to a plist domain &#8211; POSIX path of path and file without the .plist extension.<br \/>\n\t&#8211;For use in defaults do shell script.<br \/>\n\tset _path to _path as text<br \/>\n\tset _domain to _path<br \/>\n\tif ((length of _path) &#8211; (offset of &#8220;.plist&#8221; in _path)) = 5 then set _domain to text 1 thru ((length of _path) &#8211; 6) of _path<br \/>\n\treturn (POSIX path of _domain) as text<br \/>\nend ValidPlistDomain<\/p>\n<p>&#8211;WRITE PLIST VALUE<br \/>\non WritePlistValue(_path, _key, _value)<br \/>\n\t&#8211;Write a key:value pair according to the value kind:  boolean\/data\/date\/list\/number\/record\/string.<br \/>\n\tset _type to (class of _value) as text<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\tif _type = &#8220;boolean&#8221; then<br \/>\n\t\t\t\tif _value as boolean then<br \/>\n\t\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:boolean, name:_key, value:true}<br \/>\n\t\t\t\telse<br \/>\n\t\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:boolean, name:_key, value:false}<br \/>\n\t\t\t\tend if<br \/>\n\t\t\t\t(*<br \/>\n\t\t\telse if _type = &#8220;data&#8221; then &#8211;Need work here (now default to string type).<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:string, name:_key, value:_value}<br \/>\n\t\t\t\t*)<br \/>\n\t\t\telse if _type = &#8220;date&#8221; then<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:date, name:_key, value:_value}<br \/>\n\t\t\telse if _type = &#8220;list&#8221; then<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:list, name:_key, value:_value}<br \/>\n\t\t\telse if _type = &#8220;integer&#8221; or _type = &#8220;real&#8221; then<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:number, name:_key, value:_value}<br \/>\n\t\t\telse if _type = &#8220;record&#8221; then<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:record, name:_key, value:_value}<br \/>\n\t\t\t\t(*<br \/>\n\t\t\telse if _type = &#8220;text&#8221; then &#8211;Default to text property.<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:string, name:_key, value:_value}<br \/>\n\t\t\t\t*)<br \/>\n\t\t\telse &#8211;Default to text property.<br \/>\n\t\t\t\tmake new property list item at end of property list items of contents of _plistfile with properties {kind:string, name:_key, value:_value}<br \/>\n\t\t\tend if<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;WritePlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend WritePlistValue<\/p>\n<p>(*<br \/>\nStill need to work on SE implementation of reading\/writing the contents.<br \/>\n&#8211;WRITE PLIST CONTENTS<br \/>\non WritePlistContents(_path, _value)<br \/>\n\t&#8211;Write the _value to the contents of _path.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path<br \/>\n\t\t\tset value of contents of _plistfile to (_value as property list item)<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ModifyPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend WritePlistContents<br \/>\n*)<br \/>\n&#8211;WRITE PLIST<br \/>\non WritePlist(_path, _thePlist)<br \/>\n\t&#8211;Overwrite the contents with the passed plist dictionary (AS record).<br \/>\n\t&#8211;The passed parameter should be a AS record. Change thePlist to a UNIX acceptable dictionary.<br \/>\n\t&#8212;\tplist must be a property list representation of a dictionary, and must be enclosed in single quotes.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tdo shell script (&#8220;defaults write &#8221; &#038; _domain &#038; &#8221; &#8221; &#038; quoted form of _thePlist)<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;WritePlist error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend WritePlist<\/p>\n<p>(*<br \/>\n&#8211;WRITE PLIST DATA VALUE<br \/>\non WritePlistDataValue(_path, _value)<br \/>\n\t&#8211;Use defaults to write data type value to _path.<br \/>\n\t&#8211;THIS NEEDS WORK.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tdo shell script (&#8220;defaults write &#8221; &#038; _domain &#038; &#8221; -data &#8221; &#038; quoted form of _thePlist)<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;WritePlistDataValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend WritePlistDataValue<br \/>\n*)<\/p>\n<p>&#8211;READ PLIST VALUE<br \/>\non ReadPlistValue(_path, _key)<br \/>\n\t&#8211;Return the value from the _path associated with the _key.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\treturn value of property list item _key of contents of _plistfile<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ReadPlistValue<\/p>\n<p>&#8211;READ PLIST NAME<br \/>\non ReadPlistName(_path, _key)<br \/>\n\t&#8211;Return the name from the _path associated with the _key.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\treturn name of property list item _key of contents of _plistfile<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ReadPlistName<\/p>\n<p>&#8211;READ PLIST TEXT<br \/>\non ReadPlistText(_path, _key)<br \/>\n\t&#8211;Return the text representation associated with the _key from the _path.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\treturn text of property list item _key of contents of _plistfile<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ReadPlistText<\/p>\n<p>&#8211;READ PLIST KIND<br \/>\non ReadPlistKind(_path, _key)<br \/>\n\t&#8211;Return the kind associated with the _key from the _path.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\treturn kind of property list item _key of contents of _plistfile<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ReadPlistKind<\/p>\n<p>(*<br \/>\nStill need to work on SE implementation of reading\/writing the contents.<br \/>\n&#8211;READ PLIST CONTENTS<br \/>\non ReadPlistContents(_path)<br \/>\n\t&#8211;Return the contents from the _path.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\treturn value of contents of _plistfile as text<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ReadPlistContents<br \/>\n*)<br \/>\n&#8211;READ PLIST<br \/>\non ReadPlist(_path)<br \/>\n\t&#8211;Return the entire plist (all of the defaults for the domain). The contents of the _path.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tset _thePlist to (do shell script (&#8220;defaults read &#8221; &#038; _domain))<br \/>\n\ton error<br \/>\n\t\t&#8211;display dialog &#8220;ReadPlist error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\tset _thePlist to &#8220;&#8221; as text<br \/>\n\tend try<br \/>\n\treturn _thePlist<br \/>\nend ReadPlist<\/p>\n<p>&#8211;MODIFY PLIST VALUE<br \/>\non ModifyPlistValue(_path, _key, _value)<br \/>\n\t&#8211;Modify value of a stored key:value pair.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path<br \/>\n\t\t\tset value of property list item _key of contents of _plistfile to _value<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ModifyPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ModifyPlistValue<\/p>\n<p>&#8211;MODIFY PLIST SUB-VALUE<br \/>\non ModifyPlistSubValue(_path, _key, _subkey, _value)<br \/>\n\t&#8211;Modify key:value (_subkey) of a stored key:value (_key).<br \/>\n\ttry<br \/>\n\t\t&#8211;change the value of a property list item within another property list item.<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path &#8211;_path is converted to a : delimited path.<br \/>\n\t\t\tset value of property list item _subkey of property list item _key of contents of _plistfile to _value<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;ModifyPlistValue error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend ModifyPlistSubValue<\/p>\n<p>&#8211;RENAME KEY<br \/>\non RenamePlistKey(_path, _oldkey, _newkey)<br \/>\n\t&#8211;Renames the old_key to the new_key via defaults.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tdo shell script (&#8220;defaults rename &#8221; &#038; _domain &#038; &#8221; &#8221; &#038; ((the quoted form of _oldkey) as text) &#038; &#8221; &#8221; &#038; ((the quoted form of _newkey) as text))<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;RenamePlistKey defaults error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend RenamePlistKey<\/p>\n<p>&#8211;DELETE PLIST KEY<br \/>\n(*<br \/>\non DeletePlistKey(_path, _key)<br \/>\n\t&#8211;This is supposed to remove a property item, but it does not work.<br \/>\n\t&#8211;It is a known bug in AS System Events.<br \/>\n\t&#8211;Use defaults delete here until this is fixed.<br \/>\n\ttry<br \/>\n\t\ttell application &#8220;System Events&#8221;<br \/>\n\t\t\tset _plistfile to property list file _path<br \/>\n\t\t\tdelete property list item _key in contents of _plistfile<br \/>\n\t\tend tell<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;DeletePlistKey error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend DeletePlistKey<br \/>\n*)<br \/>\non DeletePlistKey(_path, _key)<br \/>\n\t&#8211;Removes the passed key:value pair from _path.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tdo shell script (&#8220;defaults delete &#8221; &#038; _domain &#038; &#8221; &#8221; &#038; (the quoted form of _key))<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;DeletePlistKey defaults error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend DeletePlistKey<\/p>\n<p>&#8211;DELETE PLIST CONTENTS<br \/>\non DeletePlistContents(_path)<br \/>\n\t&#8211;Removes all default information for domain.<br \/>\n\tset _domain to my ValidPlistDomain(_path) &#8211;Return POSIX path of _path.<br \/>\n\ttry<br \/>\n\t\tdo shell script (&#8220;defaults delete &#8221; &#038; _domain)<br \/>\n\ton error &#8211;emess number errnum<br \/>\n\t\t&#8211;display dialog &#8220;DeletePlistContent defaults error: &#8221; &#038; errnum &#038; &#8221; &#8221; &#038; emess<br \/>\n\t\treturn &#8220;&#8221;<br \/>\n\tend try<br \/>\nend DeletePlistContents<br \/>\n<!--\/raw--><\/textarea><br \/>\n<input onclick=<?php echo '\"this.form.te_'.get_the_ID().'.focus();this.form.te_'.get_the_ID().'.select();\"';?> type=&#8221;button&#8221; value=&#8221;Select All&#8221; \/> <input type=\"reset\" value=\"Reset\" \/><\/form>\n","protected":false},"excerpt":{"rendered":"<p>PlistLib PlistLib is a free AppleScript library of essential functions to manage preference list files from within AppleScript code. Use System Events and some &#8220;defaults&#8221; shell script plist commands to manage plist&#8217;s from within AppleScript scripts and applications. Verify, create, <span class=\"excerpt-dots\">&hellip;<\/span> <a class=\"more-link\" href=\"https:\/\/lorenzcom.com\/?p=733\"><span class=\"more-msg\">Continue reading &rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,10,42],"tags":[41,39,40],"_links":{"self":[{"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/posts\/733"}],"collection":[{"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=733"}],"version-history":[{"count":10,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/posts\/733\/revisions"}],"predecessor-version":[{"id":754,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=\/wp\/v2\/posts\/733\/revisions\/754"}],"wp:attachment":[{"href":"https:\/\/lorenzcom.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lorenzcom.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}