The Omni Group Forums

The Omni Group Forums (http://forums.omnigroup.com/index.php)
-   OmniOutliner 3 for Mac (http://forums.omnigroup.com/forumdisplay.php?f=9)
-   -   Export only a section of an outline...? (http://forums.omnigroup.com/showthread.php?t=24853)

rvdparis 2012-07-09 02:53 AM

Export only a section of an outline...?
 
[B]Is it possible to export as opml a section of an outline?
[/B]

I have a large body of work that I am outlining in OmniOutliner and would like to export pieces of it to Scrivener to continue drafting it. But when I go to export to opml (which Scrivener happily imports), I am forced to export the WHOLE outline, even if I select only certain rows.

I've tried to copy and paste, but it's not the same thing as importing in Scrivener. The results are not desirable.

Am I missing something? Or is there a script around that can export only sections of an outline? Or no one has thought of it, or needs it? :)

Thanks, R.

rogbar 2012-07-09 10:59 AM

Have you tried Hoisting just the section you need?

Or, failing that, copying the pertinent sections to a new outline and exporting that?

RobTrew 2012-07-09 12:37 PM

1 Attachment(s)
You should, in principle, be able to do it with Applescript.

(The only obvious limitation is, if you have checked [I]Automatically create attachments from typed URLs[/I] under [B]Preferences > General[/B] any URLS that have been converted to gray lozenges).

The following quick draft aims to export any selected row(s) (and all the descendants thereof) to an OPML file. Note that if you have selected a parent row, there is no need to select any of its children or descendants - doing so will just cause a duplication in the export.

Rough first draft:
[CODE]-- Indicative draft Ver 0.03

-- Saves any subtree selected in OmniOutliner to an OPML file
-- Note that the whole sub-tree is copied, so only 'parent' elements need to be selected.

-- Disclaimer
-- This is just a rough draft of something which I have sketched for my own personal use,
-- and which is provided purely as an illustration of possible approaches to coding.
-- You are free to adapt and reuse any part of it, without any warranties, implied
-- or explicit, as to its behaviour or suitability for use

-- Robin Trew - houthakker72 at gmail

-- ver 0.03 slightly modified to remove leading newline character, which choked some opml editors


property pOPMLHeadToExpand : "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<opml version=\"1.0\">
<head>
<title>Selected in OO3</title>
<expansionState>"
property pOPMLHeadFromExpand : "</expansionState>
</head>
<body>
"

property pOPMLTail : "
</body>
</opml>"

property pNodeStart : "<outline "
property pLeafClose : "/>"
property pParentClose : "</outline>"

property pDate : date

on run
set strOPML to MakeOPML(SelectedInOO())
if strOPML ≠ "" then
set oFile to choose file name with prompt "Save selected rows and their descendants as OPML" default name "Untitled.opml" default location (path to desktop) as alias
WriteText2Path(strOPML, POSIX path of oFile)
end if
end run

-- BUILD OPML
on MakeOPML(lstRows)
if (length of lstRows > 0) then

set {lngIndex, strExpand, strOutline} to my Rows2OPML(-1, lstRows, tab)
set strOPML to pOPMLHeadToExpand & strExpand & pOPMLHeadFromExpand & strOutline & pOPMLTail
return strOPML
else
return ""
end if
end MakeOPML

on Rows2OPML(lngIndex, lstRows, strIndent)
set {strExpand, strOut} to {"", ""}
repeat with oRow in lstRows
set {strState, strName, strNote, lstCols, lstChiln} to oRow

set strOut to strOut & pNodeStart & Attr("text", strName)
if strState ≠ "" then set strOut to strOut & space & Attr("_status", strState)
if strNote ≠ "" then set strOut to strOut & space & Attr("_note", strNote)

repeat with oCol in lstCols
set {strKey, strValue} to oCol
if strValue ≠ "" then
set strOut to strOut & my Attr(strKey, strValue)
end if
end repeat

set lngIndex to lngIndex + 1
if (length of lstChiln > 0) then
set strExpand to strExpand & "," & (lngIndex) as string
set {lngIndex, strSubExpand, strSubOutln} to Rows2OPML(lngIndex, lstChiln, strIndent & tab)
if strSubExpand ≠ "" then set strExpand to strExpand & "," & strSubExpand
set strOut to strOut & ">" & return & ¬
strIndent & strSubOutln & return & ¬
strIndent & pParentClose
else
set strOut to strOut & pLeafClose & return
end if
end repeat
if strExpand begins with "," and length of strExpand > 1 then set strExpand to text 2 thru -1 of strExpand
return {lngIndex, strExpand, strOut}
end Rows2OPML

on Attr(strName, strValue)
strName & "=" & EscapeChars(strValue)
end Attr

on EscapeChars(str)
-- QUOTE < > & ETC
set strEncoded to (do shell script "python -c 'import sys; from xml.sax.saxutils import quoteattr; print quoteattr(sys.argv[1])' " & ¬
quoted form of str)

-- ENCODE DIACRITICS AND SPECIAL CHARACTERS
set lstChars to characters of strEncoded
repeat with i from 1 to length of lstChars
set lngCode to id of item i of lstChars
if lngCode > 127 then set item i of lstChars to ("&#" & lngCode as string) & ";"
end repeat
lstChars as Unicode text
end EscapeChars


-- READ SELECTED OO3 ROWS TO NESTED APPLESCRIPT LISTS - Ver.04
on SelectedInOO()
tell application id "OOut"
if (count of documents) < 1 then return {}
tell front document
-- ANYTHING SELECTED ?
set lstSeln to selected rows as list
set lngSeln to length of lstSeln
if lngSeln < 1 then return {}

-- GET THE NAMES AND TYPES OF ANY EXTRA COLUMNS (Beyond topic and note)
set {idTopic, idNote} to {id of topic column, id of note column}
tell (columns where id is not idTopic and id is not idNote)
set {lstID, lstClass, lstName} to {id, type, name}
end tell
set lngUserCols to length of lstID

-- GATHER THE SELECTED ROWS AND THEIR CHILDREN INTO A NESTED LIST
repeat with iRow from 1 to lngSeln
set item iRow of lstSeln to my Row2Node(item iRow of lstSeln, lngUserCols, lstID, lstClass, lstName)
end repeat
end tell

return lstSeln
end tell
end SelectedInOO


on Row2Node(oRow, lngUserCols, lstID, lstClass, lstName)
tell application id "OOut"
-- COLLECT VALUES FROM TOPIC AND NOTE
set strState to state of oRow
if (strState ≠ checked) and (strState ≠ indeterminate) then
set strState to ""
else
set strState to strState as string
end if
set lstRow to {strState, topic of oRow, note of oRow}

-- FROM ANY ADDITIONAL USER COLUMNS
if lngUserCols > 0 then
set lstCols to {}
repeat with i from 1 to lngUserCols
set varValue to value of cell id (item i of lstID) of oRow
set cType to item i of lstClass
if varValue is missing value then
set varValue to ""
else if cType = date then
set varValue to short date string of varValue & space & time string of varValue
else if cType = checkbox then
if varValue = "checked" then
set varValue to "2"
else
set varValue to ""
end if
else if cType = duration then
set varValue to ((varValue) as string) & "h"
end if

set end of lstCols to {item i of lstName, varValue as string}
end repeat
set end of lstRow to lstCols
else
set end of lstRow to {}
end if

-- AND FROM ANY CHILDREN
set refChiln to children of oRow
if refChiln is missing value then
set end of lstRow to {}
else
set lstChiln to {}
repeat with oChild in refChiln
set end of lstChiln to my Row2Node(oChild, lngUserCols, lstID, lstClass, lstName)
end repeat
set end of lstRow to lstChiln
end if
return lstRow
end tell
end Row2Node


on WriteText2Path(strText, strPosixPath)
set f to (POSIX file strPosixPath)
open for access f with write permission
write strText as «class utf8» to f
close access f
end WriteText2Path[/CODE]

rvdparis 2012-07-11 03:27 AM

Wow, thanks for this script. But I get a syntax error:

Expected end of line, etc. but found “<”

Thank you for helping...

R

RobTrew 2012-07-11 04:56 AM

Copying and pasting code from these forms can be tricky if anything gets missed out.

I've added a zipped script file above – see if you still get an error with a download of that.

Rob


All times are GMT -8. The time now is 08:18 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.