Menu

Skip to content
AppleScriptの穴
  • Home
  • Products
  • Books
  • Docs
  • Events
  • Forum
  • About This Blog
  • License
  • 仕事依頼

AppleScriptの穴

Useful & Practical AppleScript archive. Click '★Click Here to Open This Script' Link to download each AppleScript

タブでインデントしたテキストをOutLineViewで表示できるデータ形式に変換 v4(3階層対応)

Posted on 10月 10 by Takaaki Naganoya

タブでインデントしたテキストを、NSOutlineViewで表示できるデータ形式に変換するAppleScriptの改良版です。

主に、Keynote書類の各スライド(ページ)上のタイトルを、そのマスタースライド名をもとにインデントレベルを仮想的に判定し、PDFのTOCを作成する際の「プレビュー」を行うべく、NSOutLineViewで表示するために作成したものです。

ChatGPTにオーダーを出して、エラー内容と処理結果をそのまま差し返すことで、数回このフローを繰り返して正しい処理内容を取得できました。

これ自体は、テストデータ(テキスト)からNSOutLineView表示用のデータを作成するだけのScriptです。

Tab n個のn階層をサポートしています。

表紙
目次
1章
	セクション1
		項目1
			コラム1
		項目2
			コラム2
	セクション2
		項目3
2章
	セクションA
		項目A1
		項目A2
	セクションB
裏表紙

こんなデータを、

{{|name|:"表紙", isLeaf:true, children:{}}, {|name|:"目次", isLeaf:true, children:{}}, {|name|:"1章", isLeaf:false, children:{{|name|:"セクション1", isLeaf:false, children:{{|name|:"項目1", isLeaf:false, children:{{|name|:"コラム1", isLeaf:true, children:{}}}}, {|name|:"項目2", isLeaf:false, children:{{|name|:"コラム2", isLeaf:true, children:{}}}}}}, {|name|:"セクション2", isLeaf:false, children:{{|name|:"項目3", isLeaf:true, children:{}}}}}}, {|name|:"2章", isLeaf:false, children:{{|name|:"セクションA", isLeaf:false, children:{{|name|:"項目A1", isLeaf:true, children:{}}, {|name|:"項目A2", isLeaf:true, children:{}}}}, {|name|:"セクションB", isLeaf:true, children:{}}}}, {|name|:"裏表紙", isLeaf:true, children:{}}}

のように変換します。

NSOutlineViewをダイアログ表示するAppleScriptライブラリを作りかけて、データ作成部分もライブラリに組み込まないと使い物にならないと気づき、ChatGPTに作らせたものです。

AppleScript名:タブでインデントしたテキストをOutLineViewで表示できるデータ形式に変換 v4(3階層対応).scpt
—
–  Created by: Takaaki Naganoya
–  Created on: 2025/10/10
—
–  Copyright © 2025 Piyomaru Software, All Rights Reserved
—

use AppleScript version "2.8"
use framework "Foundation"
use scripting additions

— サンプル入力(3階層以上)
set srcText to "表紙
目次
1章
  セクション1
    項目1
      コラム1
    項目2
      コラム2
  セクション2
    項目3
2章
  セクションA
    項目A1
    項目A2
  セクションB
裏表紙"

set aRec to convStrToStructuredRec(srcText) of me
–> {{|name|:"表紙", isLeaf:true, children:{}}, {|name|:"目次", isLeaf:true, children:{}}, {|name|:"1章", isLeaf:false, children:{{|name|:"セクション1", isLeaf:false, children:{{|name|:"項目1", isLeaf:false, children:{{|name|:"コラム1", isLeaf:true, children:{}}}}, {|name|:"項目2", isLeaf:false, children:{{|name|:"コラム2", isLeaf:true, children:{}}}}}}, {|name|:"セクション2", isLeaf:false, children:{{|name|:"項目3", isLeaf:true, children:{}}}}}}, {|name|:"2章", isLeaf:false, children:{{|name|:"セクションA", isLeaf:false, children:{{|name|:"項目A1", isLeaf:true, children:{}}, {|name|:"項目A2", isLeaf:true, children:{}}}}, {|name|:"セクションB", isLeaf:true, children:{}}}}, {|name|:"裏表紙", isLeaf:true, children:{}}}

on convStrToStructuredRec(srcText)
  set nsText to current application’s NSString’s stringWithString:srcText
  
set allLines to nsText’s componentsSeparatedByCharactersInSet:(current application’s NSCharacterSet’s newlineCharacterSet())
  
  
set topList to {} — 最終出力
  
set stack to {} — 階層ごとの親ノードを保持
  
  
repeat with aLine in allLines
    set lineNS to (current application’s NSString’s stringWithString:(aLine as text))
    
set trimmedStr to (lineNS’s stringByTrimmingCharactersInSet:(current application’s NSCharacterSet’s whitespaceAndNewlineCharacterSet())) as text
    
if trimmedStr is "" then
      — 空行スキップ
    else
      — 行頭タブ数
      
set len to lineNS’s |length|()
      
set tabCount to 0
      
repeat with i from 0 to (len – 1)
        set ch to (lineNS’s characterAtIndex:i)
        
if (ch as integer) = 9 then
          set tabCount to tabCount + 1
        else
          exit repeat
        end if
      end repeat
      
      
— タブ除去文字列
      
if len > tabCount then
        set contentText to (lineNS’s substringFromIndex:tabCount) as text
      else
        set contentText to ""
      end if
      
      
— 新しいレコード
      
set newRec to {|name|:contentText, isLeaf:true, children:{}}
      
      
if tabCount = 0 then
        — トップレベル
        
set end of topList to newRec
        
set stack to {newRec}
      else
        — stack を tabCount に合わせて切り詰め
        
if (count of stack) ≥ tabCount then
          set stack to items 1 thru tabCount of stack
        end if
        
— 親ノード取得
        
set parentRec to item tabCount of stack
        
— 親の children に追加
        
set parentChildren to parentRec’s children
        
set end of parentChildren to newRec
        
set parentRec’s children to parentChildren
        
— 親の isLeaf を false に
        
set parentRec’s isLeaf to false
        
— stack に追加
        
set end of stack to newRec
      end if
    end if
  end repeat
  
  
return topList
end convStrToStructuredRec

★Click Here to Open This Script 

(Visited 1 times, 1 visits today)
Posted in list Record Text | Tagged 15.0savvy 26.0savvy | Leave a comment

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

電子書籍(PDF)をオンラインストアで販売中!

Google Search

Popular posts

  • Numbersで選択範囲のセルの前後の空白を削除
  • macOS 26, Tahoe
  • macOS 15でも変化したText to Speech環境
  • KagiのWebブラウザ、Orion
  • Script Debuggerの開発と販売が2025年に終了
  • 【続報】macOS 15.5で特定ファイル名パターンのfileをaliasにcastすると100%クラッシュするバグ
  • macOS 15 リモートApple Eventsにバグ?
  • NSObjectのクラス名を取得 v2.1
  • 2024年に書いた価値あるAppleScript
  • 有害ではなくなっていたSpaces
  • macOS 15:スクリプトエディタのAppleScript用語辞書を確認できない
  • Xcode上のAppleScriptObjCのプログラムから、Xcodeのログ欄へのメッセージ出力を実行
  • (確認中)AppleScript Dropletのバグっぽい動作が解消?
  • AVSpeechSynthesizerで読み上げテスト
  • AppleScript Dropletのバグっぽい動作が「復活」(macOS 15.5β)
  • 指定フォルダ以下の画像のMD5チェックサムを求めて、重複しているものをピックアップ
  • macOS 26, 15.5でShortcuts.app「AppleScriptを実行」アクションのバグが修正される
  • Numbersで選択中の2列のセルを比較して並べ直して書き戻す v2
  • Apple、macOS標準搭載アプリ「写真」のバージョン表記を間違える
  • Script DebuggerがmacOS 15.x上で起動せず→起動

Tags

10.11savvy (1101) 10.12savvy (1242) 10.13savvy (1391) 10.14savvy (587) 10.15savvy (438) 11.0savvy (283) 12.0savvy (212) 13.0savvy (204) 14.0savvy (159) 15.0savvy (154) CotEditor (66) Finder (52) Keynote (119) NSAlert (61) NSArray (51) NSBitmapImageRep (20) NSBundle (20) NSButton (34) NSColor (53) NSDictionary (28) NSFileManager (23) NSFont (21) NSImage (41) NSJSONSerialization (21) NSMutableArray (63) NSMutableDictionary (22) NSPredicate (36) NSRunningApplication (56) NSScreen (30) NSScrollView (22) NSString (119) NSURL (98) NSURLRequest (23) NSUTF8StringEncoding (30) NSView (33) NSWorkspace (20) Numbers (76) Pages (56) Pixelmator Pro (20) Safari (44) Script Editor (27) WKUserContentController (21) WKUserScript (20) WKWebView (23) WKWebViewConfiguration (22)

カテゴリー

  • 2D Bin Packing
  • 3D
  • AirDrop
  • AirPlay
  • Animation
  • AppleScript Application on Xcode
  • Beginner
  • Benchmark
  • beta
  • Bluetooth
  • Books
  • boolean
  • bounds
  • Bug
  • Calendar
  • call by reference
  • check sum
  • Clipboard
  • Cocoa-AppleScript Applet
  • Code Sign
  • Color
  • Custom Class
  • date
  • dialog
  • diff
  • drive
  • Droplet
  • exif
  • file
  • File path
  • filter
  • folder
  • Font
  • Font
  • GAME
  • geolocation
  • GUI
  • GUI Scripting
  • Hex
  • History
  • How To
  • iCloud
  • Icon
  • Image
  • Input Method
  • Internet
  • iOS App
  • JavaScript
  • JSON
  • JXA
  • Keychain
  • Keychain
  • Language
  • Library
  • list
  • Locale
  • Localize
  • Machine Learning
  • Map
  • Markdown
  • Menu
  • Metadata
  • MIDI
  • MIME
  • Natural Language Processing
  • Network
  • news
  • Newt On Project
  • Noification
  • Notarization
  • Number
  • Object control
  • OCR
  • OSA
  • parallel processing
  • PDF
  • Peripheral
  • process
  • PRODUCTS
  • QR Code
  • Raw AppleEvent Code
  • Record
  • rectangle
  • recursive call
  • regexp
  • Release
  • Remote Control
  • Require Control-Command-R to run
  • REST API
  • Review
  • RTF
  • Sandbox
  • Screen Saver
  • Script Libraries
  • Scripting Additions
  • sdef
  • search
  • Security
  • selection
  • shell script
  • Shortcuts Workflow
  • Sort
  • Sound
  • Spellchecker
  • Spotlight
  • SVG
  • System
  • Tag
  • Telephony
  • Text
  • Text to Speech
  • timezone
  • Tools
  • Update
  • URL
  • UTI
  • Web Contents Control
  • WiFi
  • XML
  • XML-RPC
  • イベント(Event)
  • 未分類

アーカイブ

  • 2025年10月
  • 2025年9月
  • 2025年8月
  • 2025年7月
  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2024年2月
  • 2024年1月
  • 2023年12月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年2月
  • 2023年1月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年12月
  • 2019年11月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年10月
  • 2018年9月
  • 2018年8月
  • 2018年7月
  • 2018年6月
  • 2018年5月
  • 2018年4月
  • 2018年3月
  • 2018年2月

https://piyomarusoft.booth.pm/items/301502

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org

Forum Posts

  • 人気のトピック
  • 返信がないトピック

メタ情報

  • ログイン
  • 投稿フィード
  • コメントフィード
  • WordPress.org
Proudly powered by WordPress
Theme: Flint by Star Verte LLC